I SQL, ALTER TABLE
uttalandet ändrar definitionen av en befintlig tabell.
Du kan använda ALTER TABLE
för att ändra, lägga till eller släppa kolumner och begränsningar.
Beroende på ditt DBMS, ALTER TABLE
uttalande kan också användas för att omtilldela och bygga om partitioner, eller inaktivera och aktivera begränsningar och utlösare.
Syntax
ALTER TABLE
uttalande brukar se ut så här:
ALTER TABLE table_name
[alter_option [, alter_option] ...]
[partition_options]
Var:
table_name
är namnet på tabellen du vill ändra.[alter_option [, alter_option] …]
är en lista över de specifika ändringar du vill göra (till exempelADD
följt av kolumnnamnet och definitionen, ellerDROP COLUMN
följt av kolumnnamnet osv.).[partition_options]
är en valfri lista med alternativ specifikt för partitionerade tabeller. Inte alla DBMS stöder partitionerade tabeller. Om ditt gör det kan sådana alternativ göra det möjligt för dig att lägga till, släppa, kassera, importera, slå samman eller dela partitioner eller utföra partitioneringsunderhåll.
Den fullständiga syntaxen för ALTER TABLE
kan vara ganska komplicerat och varierar avsevärt mellan DBMS. För allt som inte tas upp i den här artikeln, se din DBMS-dokumentation.
Nedan finns exempel på de vanligaste ALTER TABLE
operationer.
Lägg till en ny kolumn
För att lägga till en ny kolumn i en tabell, använd ADD
sats, följt av kolumnnamnet och datatypen.
ALTER TABLE Products
ADD ProductDescription varchar(500);
Detta lägger till en ny kolumn som heter ProductDescription
till Products
bord.
I det här exemplet gjorde vi kolumnen till en varchar(500)
men du skulle använda vilken datatyp som helst som är lämplig för din nya kolumn.
Du kan också inkludera begränsningar i din kolumndefinition, men det kan bero på ditt DBMS och om tabellen redan innehåller data eller inte (se diskussionen nedan om detta).
Byt namn på en kolumn
De flesta av de stora RDBMS:erna (PostgreSQL, Oracle, SQLite, MySQL 8.0+, MariaDB 10.5.2+) låter dig byta namn på en kolumn så här:
ALTER TABLE table_name
RENAME COLUMN column_name TO new_column_name;
Om du använder MySQL före version 8.0, eller MariaDB före 10.5.2+, måste du använda CHANGE COLUMN
syntax istället, vilket också kräver att du specificerar datatypen igen. Så här:
ALTER TABLE table_name
CHANGE COLUMN old_column_name new_column_name datatype;
I SQL Server måste du använda sp_rename
lagrad procedur för att byta namn på en kolumn. Så här:
EXEC sp_rename 'schema_name.table_name.column_name', 'new_column_name', 'COLUMN';
Släpp en kolumn
För att ta bort en kolumn, använd DROP COLUMN
klausul, följt av kolumnnamnet.
ALTER TABLE table_name
DROP COLUMN column_name;
Ändra en kolumns definition
Syntaxen för att ändra en befintlig kolumns definition varierar avsevärt mellan DBMS. Det beror också på vilka ändringar du behöver göra.
För att göra det enkelt, låt oss göra en enkel modifiering av en kolumn i SQL Server:
ALTER TABLE Products
ALTER COLUMN ProductDescription varchar(1000);
I det här exemplet ändrade vi ProductDescription
kolumn från varchar(500)
till varchar(1000)
.
Följande visar den grundläggande syntaxen som krävs av varje DBMS för att göra samma eller liknande ändringar.
SQL Server:
ALTER TABLE table_name
ALTER COLUMN column_name datatype;
PostgreSQL:
ALTER TABLE table_name
ALTER COLUMN column_name TYPE datatype;
MySQL, MariaDB och Oracle före 10g:
ALTER TABLE table_name
MODIFY COLUMN column_name datatype;
I Oracle 10g och senare:
ALTER TABLE table_name
MODIFY column_name datatype;
SQLite låter dig inte ändra en kolumn, annat än att byta namn på den.
Den faktiska syntaxen för varje DBMS är vanligtvis mycket mer komplex än så här, och beror på exakt vad du försöker göra. Detta bör dock få dig igång med grundläggande kolumnändringar.
Begränsningar och överväganden
Du bör generellt undvika att göra ändringar i tabeller när de innehåller data. Genom att göra ändringar riskerar du att förlora befintlig data.
Med det sagt hindrar många DBMS dig faktiskt från att göra vissa ändringar när en tabell väl innehåller data. Till exempel kan du upptäcka att du inte kan lägga till en NOT NULL
begränsning till en kolumn som innehåller data.
Vissa DBMS kan tillåta dig att göra det, så länge du använder en DEFAULT
begränsning (för att tillhandahålla ett standardvärde för kolumner som inte explicit har infogats i dem), eller en kolumn Identity/autoinkrement, eller en tidsstämpelskolumn, etc.
Vissa DBMS tillåter dig inte att släppa eller ändra kolumner i en tabell.
Vissa DBMS begränsar också de datatyper som kan läggas till.
Exempel – Lägga till en NOT NULL-begränsning
Här är ett exempel för att visa ovanstående punkter.
Här är vad som händer när jag försöker lägga till en kolumn med en NOT NULL
begränsning i SQL Server.
ALTER TABLE Products
ADD ProductDescription varchar(500) NOT NULL;
Resultat:
Msg 4901, Level 16, State 1, Line 1 ALTER TABLE only allows columns to be added that can contain nulls, or have a DEFAULT definition specified, or the column being added is an identity or timestamp column, or alternatively if none of the previous conditions are satisfied the table must be empty to allow addition of this column. Column 'ProductDescription' cannot be added to non-empty table 'Products' because it does not satisfy these conditions.
I grund och botten innehåller tabellen redan data, så SQL Server returnerar ett fel som talar om för mig att jag bara kan lägga till en NOT NULL
begränsning om tabellen uppfyller vissa kriterier och den ännu inte uppfyller dessa kriterier.
Och det finns en bra anledning till det kriteriet.
En NOT NULL
begränsning säkerställer att det inte finns någon NULL
värden i kolumnen i valfri rad. Problemet är att vi redan har data i tabellen, och om vi lägger till en ny kolumn kommer de befintliga raderna att vara NULL
– vilket omedelbart kommer att bryta mot vår NOT NULL
begränsning. Så vi måste specificera data för att gå in i de befintliga raderna.
För att göra detta kan vi lägga till en DEFAULT
begränsning eller liknande för att säkerställa att eventuella befintliga rader automatiskt fylls i med data i den här kolumnen.
Exempel:
ALTER TABLE Products
ADD ProductDescription varchar(500) NOT NULL DEFAULT 'N/A';
Detta lägger helt enkelt till en DEFAULT
begränsning till kolumnen. Denna begränsning säkerställer att alla rader innehåller ett värde (i det här fallet är värdet N/A
) om de inte har tilldelats ett värde. Det betyder att vår NOT NULL
begränsning kommer inte att överträdas, eftersom alla befintliga rader nu kommer att innehålla ett värde.
Om den nya kolumnen behöver ha unika, ökande värden kan du istället göra den till en IDENTITY
kolumn (eller AUTOINCREMENT
i SQLite och andra DBMS).
Men om tabellen inte redan innehåller data kanske du kan lägga till kolumnen utan att behöva göra något av dessa steg.
Partitionsalternativ
Den här artikeln riktar sig till nybörjare, och partitionerade tabeller är lite utanför sfären av en nybörjarhandledning.
Med det sagt kommer jag snabbt att gå igenom några av partitioneringsalternativen med avseende på ALTER TABLE
uttalande.
Om din DBMS stöder partitionerade tabeller, ger den förmodligen också partitionsalternativ med ALTER TABLE
uttalande.
Till exempel, i MySQL kan du göra följande:
ALTER TABLE Products
PARTITION BY HASH(ProductId)
PARTITIONS 8;
Detta partitionerar tabellen i 8 partitioner, med HASH
, med hjälp av ProductId
kolumn som partitioneringsnyckel.
PARTITION BY HASH
använder resten av uttrycket (i detta fall ProductId
kolumn) dividerat med antalet partitioner (d.v.s. modulen).
Du kan också använda intervallpartitioner. Så här kan du lägga till en intervallpartition till en befintlig tabell:
ALTER TABLE Products
ADD PARTITION (PARTITION Partition9 VALUES LESS THAN (2020));
Detta exempel innebär att Products
tabellen har redan 8 intervallpartitioner, och vi lägger till en annan partition som heter Partition9
.
Du kan släppa partitioner så här:
ALTER TABLE Products
DROP PARTITION Partition8, Partition9;
Tänk på att dessa exempel är för MySQL.
Jag har också skrivit några artiklar om partitionerade tabeller i SQL Server. När det gäller ALTER TABLE
uttalande, här är hur du byter ut en partition och här är hur du byter in en partition (som båda görs med ALTER TABLE
).
I SQL Server måste vissa partitionsalternativ göras med andra satser. Till exempel görs sammanslagning av partitioner med ALTER PARTITION FUNCTION
sats, och uppdelning av partitioner görs med ALTER PARTITION SCHEME
uttalande.
Om du vill lära dig mer om partitionerade tabeller i SQL Server, så här skapar du en partitionerad tabell i SQL Server.
ALTER TABLE
i SQLite
Jag bör också nämna att SQLite har ett mycket begränsat stöd för ALTER TABLE
påstående. I SQLite, ALTER TABLE
sats låter dig byta namn på en tabell, byta namn på en kolumn i en tabell eller lägga till en ny kolumn i en befintlig tabell.
Alla andra ändringar kommer att kräva att du släpper tabellen och börjar om. Detta gäller även för att lägga till främmande nycklar.