sql >> Databasteknik >  >> RDS >> Database

SQL ALTER TABELL för nybörjare

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 exempel ADD följt av kolumnnamnet och definitionen, eller DROP 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.


  1. JSON_VALUE() Exempel i SQL Server (T-SQL)

  2. Exempel på att konvertera "datum" till "smalldatetime" i SQL Server (T-SQL)

  3. Hibernate> CLOB> Oracle :(

  4. Hur man får gårdagens datum i SQLite