Tabellen fungerar, men formuläret behöver plötsligt lagra en ny uppgift, till exempel en kampanjkod eller ett publiceringsdatum. Vanligen lägger du till kolumnen med ALTER TABLE ... ADD COLUMN, men exakt syntax och vad som händer med befintliga rader beror på databasen.

Rätt syntax beror på databasmotorn och kolumnens regler
- Grundmönstret:
ALTER TABLE tabell ADD COLUMN kolumn datatyp; - Befintliga rader: en ny kolumn kan ge dem
NULLeller ett standardvärde, beroende på definitionen. - NOT NULL: kontrollera att varje befintlig rad kan få ett giltigt värde innan kolumnen görs obligatorisk.
- Kolumnordning: SQL Server lägger nya kolumner sist; MySQL har särskild syntax för en annan placering.
- SQLite: har begränsningar för vilka kolumndefinitioner som kan läggas till direkt.
Börja med en nullable kolumn om befintliga rader saknar värde
Om du vill lägga till exempelvis en kort beskrivning i en redan använd tabell kan grundkommandot se ut så här:
ALTER TABLE products
ADD COLUMN description TEXT;
Med den här definitionen får äldre rader normalt NULL i den nya kolumnen. Det är ofta den minst riskabla starten när appen behöver tid att börja fylla fältet, men det finns en hake om kolumnen ska vara obligatorisk.
En kolumn med NOT NULL får inte sakna värde. Om tabellen redan innehåller rader måste databasmotorn kunna ge dem ett tillåtet värde, vanligtvis via ett standardvärde. I PostgreSQLs dokumentation om ALTER TABLE framgår också att kommandot kan kräva ett starkt lås på tabellen. För en stor, aktiv tabell bör ändringen därför planeras så att den inte överraskar pågående trafik.
Välj syntax efter databasmotorn, inte efter ett allmänt SQL-exempel
Samma idé uttrycks lite olika mellan databaser. Ett kommando som fungerar i en produkt kan fallera i en annan, särskilt när du lägger till en kolumn på en viss position.
| Databas | Exempel | Praktisk skillnad |
|---|---|---|
| PostgreSQL | ALTER TABLE products ADD COLUMN description TEXT; |
IF NOT EXISTS kan användas för att undvika fel om kolumnen redan finns. |
| MySQL | ALTER TABLE products ADD COLUMN description TEXT; |
AFTER column_name eller FIRST kan placera kolumnen på en viss position. |
| SQL Server | ALTER TABLE dbo.products ADD description NVARCHAR(200) NULL; |
En kolumn som läggs till med T-SQL hamnar sist i tabellen. |
| SQLite | ALTER TABLE products ADD COLUMN description TEXT; |
Vissa definitioner, som en ny NOT NULL-kolumn utan ett icke-NULL-standardvärde, tillåts inte. |
Skillnaden kring placering är lätt att missa. MySQLs ALTER TABLE-dokumentation beskriver FIRST och AFTER, medan Microsofts guide för SQL Server anger att T-SQL lägger till kolumnen sist. Jag tycker att det oftast är bättre att styra visningsordningen i en fråga eller i gränssnittet än att bygga om tabellen bara för kolumnordningens skull.
Om tillägget misslyckas är NULL-regeln ofta första kontrollen
Felmeddelandet pekar ofta mot en konflikt mellan kolumnens krav och tabellens befintliga innehåll. Kontrollera först om kolumnen redan finns, om datatypen passar och om den nya definitionen kräver värden som äldre rader inte har.
| Situation | Trolig orsak | Gör så här |
|---|---|---|
| Kommandot klagar på att kolumnen redan finns | Skriptet har körts tidigare eller miljön har redan ändrats. | Kontrollera tabellens schema och använd en databasspecifik lösning för upprepade migreringar. |
| En obligatorisk kolumn kan inte läggas till | Äldre rader saknar ett giltigt värde. | Lägg först till kolumnen som nullable, fyll den med data och inför sedan NOT NULL. |
| SQLite avvisar standardvärdet | SQLite begränsar bland annat uttryck och vissa tidsfunktioner som standardvärde vid direkt tillägg. | Använd ett tillåtet konstant standardvärde eller planera en migrering med ny tabell och datakopiering. |
| Kolumnen hamnar på fel plats | Ordningen styrs av databasmotorn och kommandot. | Ändra kolumnordningen i SELECT-frågan eller i presentationen i stället för att anta att SQL är portabelt. |
SQLite har särskilda begränsningar när en kolumn läggs till, bland annat kring NOT NULL och standardvärden. SQLite-dokumentationen om ALTER TABLE beskriver också att tillägg utan vissa kontroller kan gå snabbt eftersom tabellens innehåll inte behöver skrivas om. Med begränsningar som måste verifieras kan arbetet däremot ta längre tid.
Fyll kolumnen i steg innan du gör den obligatorisk
En trygg migrering för en kolumn som så småningom måste ha ett värde sker ofta stegvis. Då hinner databasen, applikationskoden och befintliga poster komma i takt i stället för att allt ändras på en gång.
- Lägg till kolumnen som tillåter
NULL. - Uppdatera applikationen så att nya poster sparar ett värde i kolumnen.
- Fyll kolumnen för äldre rader med relevanta värden, med en
UPDATE-fråga eller en kontrollerad datamigrering. - Kontrollera att inga rader fortfarande saknar värde.
- Lägg till
NOT NULLnär datan uppfyller kravet och databasmotorn stöder ändringen.
Ta en kampanjtabell som exempel: nya registreringar ska få fältet source, men äldre poster har ingen känd källa. Att direkt sätta ett påhittat standardvärde kan förvanska rapporteringen; börja hellre med ett tomt fält och fyll bara i sådant som går att härleda. För SQLite behöver du dessutom välja en metod som följer motorns begränsningar om schemat kräver mer än ett enkelt kolumntillägg.
En liten schemamigrering blir säkrare med en kontroll före driftsättning
Innan du kör ändringen i produktion, kontrollera databastyp, tabellnamn, datatyp och kolumnens null-regel i den miljö där kommandot ska köras. Kör migreringen mot en kopia eller testmiljö först om tabellen är viktig eller stor.
Kontrollera även kod som läser rader med positionsbaserad logik eller använder SELECT *; ett nytt fält kan påverka antaganden utanför själva databasen. När syftet är tydligt och befintliga rader hanteras medvetet blir tillägget oftast enkelt, även om rätt syntax beror på motorn.