sql >> Database teknologi >  >> RDS >> Database

SQL ALTER TABLE for begyndere

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 eller DROP 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.


  1. Flytning af eksisterende tabel fra primær filgruppe til en anden filgruppe

  2. Sådan kører du et SQL Server Agent Job ved hjælp af T-SQL

  3. Henter alle overordnede rækker i én SQL-forespørgsel

  4. IKKE I valg med NULL-værdier