I SQL er ALTER TABLE
sætning ændrer definitionen af en eksisterende tabel.
Du kan bruge ALTER TABLE
for at ændre, tilføje eller slette kolonner og begrænsninger.
Afhængigt af dit DBMS vil ALTER TABLE
statement kan også bruges til at omtildele og genopbygge partitioner eller deaktivere og aktivere begrænsninger og triggere.
Syntaks
ALTER TABLE
Udsagn lyder generelt sådan:
ALTER TABLE table_name
[alter_option [, alter_option] ...]
[partition_options]
Hvor:
table_name
er navnet på den tabel, du vil ændre.[alter_option [, alter_option] …]
er en liste over de specifikke ændringer, du vil foretage (f.eks.ADD
efterfulgt af kolonnenavnet og definitionen ellerDROP COLUMN
efterfulgt af kolonnenavnet osv.).[partition_options]
er en valgfri liste over muligheder specifikt for opdelte tabeller. Ikke alle DBMS'er understøtter partitionerede tabeller. Hvis din gør det, kan sådanne muligheder gøre dig i stand til at tilføje, slette, kassere, importere, flette eller opdele partitioner eller udføre partitioneringsvedligeholdelse.
Den fulde syntaks for ALTER TABLE
kan være ret kompleks og varierer betydeligt mellem DBMS'er. Se din DBMS-dokumentation for alt, der ikke er dækket af denne artikel.
Nedenfor er eksempler på de mest almindelige ALTER TABLE
operationer.
Tilføj en ny kolonne
For at tilføje en ny kolonne til en tabel, brug ADD
klausul, efterfulgt af kolonnenavnet og datatypen.
ALTER TABLE Products
ADD ProductDescription varchar(500);
Dette tilføjer en ny kolonne kaldet ProductDescription
til Products
tabel.
I dette eksempel lavede vi kolonnen til en varchar(500)
men du ville bruge den datatype, der passer til din nye kolonne.
Du kan også inkludere begrænsninger i din kolonnedefinition, men det kan afhænge af dit DBMS, og hvorvidt tabellen allerede indeholder data (se diskussionen nedenfor om dette).
Omdøb en kolonne
De fleste af de store RDBMS'er (PostgreSQL, Oracle, SQLite, MySQL 8.0+, MariaDB 10.5.2+) giver dig mulighed for at omdøbe en kolonne som denne:
ALTER TABLE table_name
RENAME COLUMN column_name TO new_column_name;
Hvis du bruger MySQL før version 8.0 eller MariaDB før 10.5.2+, skal du bruge CHANGE COLUMN
syntaks i stedet, hvilket også kræver, at du specificerer datatypen igen. Sådan:
ALTER TABLE table_name
CHANGE COLUMN old_column_name new_column_name datatype;
I SQL Server skal du bruge sp_rename
gemt procedure for at omdøbe en kolonne. Sådan:
EXEC sp_rename 'schema_name.table_name.column_name', 'new_column_name', 'COLUMN';
Slip en kolonne
For at slette en kolonne skal du bruge DROP COLUMN
klausul efterfulgt af kolonnenavnet.
ALTER TABLE table_name
DROP COLUMN column_name;
Rediger en kolonnes definition
Syntaksen for ændring af en eksisterende kolonnes definition varierer betydeligt mellem DBMS'er. Det afhænger også af, hvilke ændringer du skal foretage.
For at holde tingene enkle, lad os lave en simpel ændring af en kolonne i SQL Server:
ALTER TABLE Products
ALTER COLUMN ProductDescription varchar(1000);
I dette eksempel ændrede vi ProductDescription
kolonne fra varchar(500)
til varchar(1000)
.
Det følgende viser den grundlæggende syntaks, der kræves af hvert DBMS for at udføre de samme eller lignende ændringer.
SQL Server:
ALTER TABLE table_name
ALTER COLUMN column_name datatype;
PostgreSQL:
ALTER TABLE table_name
ALTER COLUMN column_name TYPE datatype;
MySQL, MariaDB og Oracle før 10g:
ALTER TABLE table_name
MODIFY COLUMN column_name datatype;
I Oracle 10g og nyere:
ALTER TABLE table_name
MODIFY column_name datatype;
SQLite vil ikke lade dig ændre en kolonne, udover at omdøbe den.
Den faktiske syntaks for hver DBMS er normalt meget mere kompleks end dette og afhænger af præcis, hvad du forsøger at gøre. Dette burde dog få dig i gang med grundlæggende kolonneændringer.
Begrænsninger og overvejelser
Du bør generelt undgå at foretage ændringer i tabeller, når de først indeholder data. Ved at foretage ændringer risikerer du at miste eksisterende data.
Når det er sagt, forhindrer mange DBMS'er dig faktisk i at foretage visse ændringer, når først en tabel indeholder data. For eksempel kan du opleve, at du ikke kan tilføje en NOT NULL
begrænsning til en kolonne, der indeholder data.
Nogle DBMS'er kan tillade dig at gøre det, så længe du bruger en DEFAULT
begrænsning (for at angive en standardværdi for kolonner, der ikke har haft data eksplicit indsat i dem), eller en identitets-/autoinkrementkolonne eller en tidsstempelkolonne osv.
Nogle DBMS'er tillader dig ikke at slette eller ændre kolonner i en tabel.
Nogle DBMS'er begrænser også de datatyper, der kan tilføjes.
Eksempel – Tilføjelse af en NOT NULL-begrænsning
Her er et eksempel for at hjælpe med at demonstrere ovenstående punkter.
Her er, hvad der sker, når jeg forsøger at tilføje en kolonne 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.
Grundlæggende indeholder tabellen allerede data, og så returnerer SQL Server en fejl, der fortæller mig, at jeg kun kan tilføje en NOT NULL
begrænsning, hvis tabellen opfylder visse kriterier, og den endnu ikke opfylder disse kriterier.
Og det er der en god grund til.
En NOT NULL
begrænsning sikrer, at der ikke er nogen NULL
værdier i kolonnen i enhver række. Problemet er, at vi allerede har data i tabellen, og hvis vi tilføjer en ny kolonne, vil de eksisterende rækker være NULL
– hvilket øjeblikkeligt vil overtræde vores NOT NULL
begrænsning. Så vi er nødt til at specificere data for at gå ind i de eksisterende rækker.
For at gøre dette kan vi tilføje en DEFAULT
begrænsning eller lignende for at sikre, at eventuelle eksisterende rækker automatisk udfyldes med data i denne kolonne.
Eksempel:
ALTER TABLE Products
ADD ProductDescription varchar(500) NOT NULL DEFAULT 'N/A';
Dette tilføjer blot en DEFAULT
begrænsning af kolonnen. Denne begrænsning sikrer, at alle rækker indeholder en værdi (i dette tilfælde er værdien N/A
), hvis de ikke er blevet tildelt en værdi. Dette betyder vores NOT NULL
begrænsning vil ikke blive overtrådt, fordi alle eksisterende rækker nu vil indeholde en værdi.
Hvis den nye kolonne skal have unikke, stigende værdier, kan du i stedet gøre den til en IDENTITY
kolonne (eller AUTOINCREMENT
i SQLite og andre DBMS'er).
Men hvis tabellen ikke allerede indeholder data, kan du muligvis tilføje kolonnen uden at skulle udføre nogen af disse trin.
Partitionsindstillinger
Denne artikel er rettet mod begyndere, og opdelte tabeller er lidt uden for en begyndervejledning.
Når det er sagt, vil jeg hurtigt gennemgå nogle af partitioneringsmulighederne med hensyn til ALTER TABLE
erklæring.
Hvis dit DBMS understøtter partitionerede tabeller, giver det sandsynligvis også partitionsmuligheder med ALTER TABLE
erklæring.
For eksempel kan du i MySQL gøre følgende:
ALTER TABLE Products
PARTITION BY HASH(ProductId)
PARTITIONS 8;
Dette opdeler tabellen i 8 partitioner med HASH
, ved hjælp af ProductId
kolonne som partitioneringsnøgle.
PARTITION BY HASH
bruger resten af udtrykket (i dette tilfælde ProductId
kolonne) divideret med antallet af partitioner (dvs. modulet).
Du kan også bruge områdepartitioner. Sådan kan du tilføje en områdepartition til en eksisterende tabel:
ALTER TABLE Products
ADD PARTITION (PARTITION Partition9 VALUES LESS THAN (2020));
Dette eksempel antyder, at Products
tabellen har allerede 8 områdepartitioner, og vi tilføjer endnu en partition kaldet Partition9
.
Du kan slippe partitioner som denne:
ALTER TABLE Products
DROP PARTITION Partition8, Partition9;
Husk, at disse eksempler er til MySQL.
Jeg har også skrevet et par artikler om partitionerede tabeller i SQL Server. Med hensyn til ALTER TABLE
sætning, her er, hvordan du skifter en partition ud, og her er, hvordan du skifter en partition ind (begge udføres med ALTER TABLE
).
I SQL Server skal nogle partitionsindstillinger udføres med andre sætninger. For eksempel udføres fletning af partitioner med ALTER PARTITION FUNCTION
sætning, og opdeling af partitioner udføres med ALTER PARTITION SCHEME
erklæring.
Hvis du gerne vil vide mere om partitionerede tabeller i SQL Server, kan du se, hvordan du opretter en partitioneret tabel i SQL Server.
ALTER TABLE
i SQLite
Jeg bør også nævne, at SQLite har en meget begrænset understøttelse af ALTER TABLE
udmelding. I SQLite er ALTER TABLE
sætning giver dig mulighed for at omdøbe en tabel, at omdøbe en kolonne i en tabel eller tilføje en ny kolonne til en eksisterende tabel.
Alle andre ændringer kræver, at du dropper bordet og starter igen. Dette gælder også for tilføjelse af fremmednøgler.