In SQL is de ALTER TABLE
statement wijzigt de definitie van een bestaande tabel.
U kunt ALTER TABLE
. gebruiken om kolommen en beperkingen te wijzigen, toe te voegen of te verwijderen.
Afhankelijk van uw DBMS, de ALTER TABLE
statement kan ook worden gebruikt om partities opnieuw toe te wijzen en opnieuw op te bouwen, of om beperkingen en triggers in en uit te schakelen.
Syntaxis
De ALTER TABLE
verklaring gaat over het algemeen als volgt:
ALTER TABLE table_name
[alter_option [, alter_option] ...]
[partition_options]
Waar:
table_name
is de naam van de tabel die u wilt wijzigen.[alter_option [, alter_option] …]
is een lijst met de specifieke wijzigingen die u wilt aanbrengen (bijvoorbeeldADD
gevolgd door de kolomnaam en definitie, ofDROP COLUMN
gevolgd door de kolomnaam, enz.).[partition_options]
is een optionele lijst met opties specifiek voor gepartitioneerde tabellen. Niet alle DBMS'en ondersteunen gepartitioneerde tabellen. Als de uwe dat wel doet, kunnen dergelijke opties u in staat stellen om partities toe te voegen, te verwijderen, te verwijderen, te importeren, samen te voegen of te splitsen, of om partities te onderhouden.
De volledige syntaxis voor ALTER TABLE
kan behoorlijk complex zijn en varieert aanzienlijk tussen DBMS'en. Raadpleeg uw DBMS-documentatie voor alles wat niet in dit artikel wordt behandeld.
Hieronder staan voorbeelden van de meest voorkomende ALTER TABLE
activiteiten.
Een nieuwe kolom toevoegen
Om een nieuwe kolom aan een tabel toe te voegen, gebruikt u de ADD
clausule, gevolgd door de kolomnaam en het gegevenstype.
ALTER TABLE Products
ADD ProductDescription varchar(500);
Dit voegt een nieuwe kolom toe met de naam ProductDescription
naar de Products
tafel.
In dit voorbeeld hebben we van de kolom een varchar(500)
. gemaakt maar u zou elk gegevenstype gebruiken dat geschikt is voor uw nieuwe kolom.
U kunt ook beperkingen opnemen in uw kolomdefinitie, maar dit kan afhankelijk zijn van uw DBMS en of de tabel al gegevens bevat (zie de discussie hieronder hierover).
De naam van een kolom wijzigen
Met de meeste grote RDBMS'en (PostgreSQL, Oracle, SQLite, MySQL 8.0+, MariaDB 10.5.2+) kunt u een kolom als volgt hernoemen:
ALTER TABLE table_name
RENAME COLUMN column_name TO new_column_name;
Als u MySQL vóór versie 8.0 of MariaDB vóór 10.5.2+ gebruikt, moet u de CHANGE COLUMN
gebruiken syntaxis, waarvoor u ook het gegevenstype opnieuw moet specificeren. Zoals dit:
ALTER TABLE table_name
CHANGE COLUMN old_column_name new_column_name datatype;
In SQL Server moet u de sp_rename
. gebruiken opgeslagen procedure om de naam van een kolom te wijzigen. Zoals dit:
EXEC sp_rename 'schema_name.table_name.column_name', 'new_column_name', 'COLUMN';
Laat een kolom vallen
Gebruik de DROP COLUMN
. om een kolom neer te zetten clausule, gevolgd door de kolomnaam.
ALTER TABLE table_name
DROP COLUMN column_name;
Wijzig de definitie van een kolom
De syntaxis voor het wijzigen van de definitie van een bestaande kolom varieert aanzienlijk tussen DBMS'en. Het hangt ook af van welke wijzigingen u moet aanbrengen.
Om het simpel te houden, laten we een simpele wijziging doen aan een kolom in SQL Server:
ALTER TABLE Products
ALTER COLUMN ProductDescription varchar(1000);
In dit voorbeeld hebben we de ProductDescription
. gewijzigd kolom uit varchar(500)
naar varchar(1000)
.
Het volgende toont de basissyntaxis die elk DBMS nodig heeft om dezelfde of soortgelijke wijzigingen aan te brengen.
SQL Server:
ALTER TABLE table_name
ALTER COLUMN column_name datatype;
PostgreSQL:
ALTER TABLE table_name
ALTER COLUMN column_name TYPE datatype;
MySQL, MariaDB en Oracle vóór 10g:
ALTER TABLE table_name
MODIFY COLUMN column_name datatype;
In Oracle 10g en hoger:
ALTER TABLE table_name
MODIFY column_name datatype;
Met SQLite kun je een kolom niet wijzigen, behalve om de naam ervan te wijzigen.
De feitelijke syntaxis voor elk DBMS is meestal veel complexer dan dit en hangt af van wat u precies probeert te doen. Dit zou u echter op weg moeten helpen met elementaire kolomaanpassingen.
Beperkingen en overwegingen
Over het algemeen moet u voorkomen dat u wijzigingen aanbrengt in tabellen als ze eenmaal gegevens bevatten. Door wijzigingen aan te brengen, loopt u het risico bestaande gegevens te verliezen.
Dat gezegd hebbende, voorkomen veel DBMS'en dat u bepaalde wijzigingen aanbrengt zodra een tabel gegevens bevat. U kunt bijvoorbeeld merken dat u geen NOT NULL
. kunt toevoegen beperken tot een kolom die gegevens bevat.
Bij sommige DBMS'en kunt u dit doen, zolang u een DEFAULT
. gebruikt beperking (om een standaardwaarde te bieden voor kolommen waarin geen expliciete gegevens zijn ingevoegd), of een kolom Identiteit/auto-increment, of een tijdstempel, enz.
Bij sommige DBMS'en kunt u geen kolommen in een tabel neerzetten of wijzigen.
Ook beperken sommige DBMS'en de datatypes die kunnen worden toegevoegd.
Voorbeeld – Een NOT NULL-beperking toevoegen
Hier is een voorbeeld om de bovenstaande punten te demonstreren.
Dit is wat er gebeurt als ik een kolom probeer toe te voegen met een NOT NULL
beperking in SQL Server.
ALTER TABLE Products
ADD ProductDescription varchar(500) NOT NULL;
Resultaat:
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.
Kortom, de tabel bevat al gegevens, en dus retourneert SQL Server een fout die me vertelt dat ik alleen een NOT NULL
kan toevoegen beperking als de tabel aan bepaalde criteria voldoet en deze nog niet aan die criteria voldoet.
En daar is een goede reden voor.
EEN NOT NULL
beperking zorgt ervoor dat er geen NULL
. zijn waarden in de kolom in een rij. Het probleem is dat we al gegevens in de tabel hebben en als we een nieuwe kolom toevoegen, zijn die bestaande rijen NULL
– wat onmiddellijk in strijd is met onze NOT NULL
beperking. We moeten dus gegevens specificeren om in de bestaande rijen te gaan.
Om dit te doen, kunnen we een DEFAULT
. toevoegen beperking of iets dergelijks om ervoor te zorgen dat bestaande rijen automatisch worden gevuld met gegevens in deze kolom.
Voorbeeld:
ALTER TABLE Products
ADD ProductDescription varchar(500) NOT NULL DEFAULT 'N/A';
Dit voegt gewoon een DEFAULT
. toe beperking van de kolom. Deze beperking zorgt ervoor dat alle rijen een waarde bevatten (in dit geval is de waarde N/A
) als er geen waarde aan is toegewezen. Dit betekent dat onze NOT NULL
beperking wordt niet geschonden, omdat alle bestaande rijen nu een waarde bevatten.
Als de nieuwe kolom unieke, oplopende waarden moet hebben, kunt u er in plaats daarvan een IDENTITY
van maken kolom (of AUTOINCREMENT
in SQLite en andere DBMS'en).
Als de tabel echter nog geen gegevens bevat, kunt u de kolom mogelijk toevoegen zonder een van deze stappen uit te voeren.
Partitie-opties
Dit artikel is bedoeld voor beginners, en gepartitioneerde tabellen vallen een beetje buiten het bereik van een beginnershandleiding.
Dat gezegd hebbende, zal ik snel enkele van de partitioneringsopties bespreken met betrekking tot de ALTER TABLE
verklaring.
Als uw DBMS gepartitioneerde tabellen ondersteunt, biedt het waarschijnlijk ook partitie-opties met de ALTER TABLE
verklaring.
In MySQL kunt u bijvoorbeeld het volgende doen:
ALTER TABLE Products
PARTITION BY HASH(ProductId)
PARTITIONS 8;
Dit verdeelt de tabel in 8 partities, door HASH
, met behulp van de ProductId
kolom als de partitiesleutel.
PARTITION BY HASH
gebruikt de rest van de uitdrukking (in dit geval de ProductId
kolom) gedeeld door het aantal partities (d.w.z. de modulus).
U kunt ook bereikpartities gebruiken. Hier ziet u hoe u een bereikpartitie aan een bestaande tabel kunt toevoegen:
ALTER TABLE Products
ADD PARTITION (PARTITION Partition9 VALUES LESS THAN (2020));
Dit voorbeeld houdt in dat de Products
tabel heeft al 8 bereikpartities en we voegen nog een partitie toe met de naam Partition9
.
Je kunt partities als volgt neerzetten:
ALTER TABLE Products
DROP PARTITION Partition8, Partition9;
Houd er rekening mee dat deze voorbeelden voor MySQL zijn.
Ik heb ook een paar artikelen geschreven over gepartitioneerde tabellen in SQL Server. Met betrekking tot de ALTER TABLE
instructie, hier is hoe u een partitie uitschakelt en hier is hoe u een partitie inschakelt (beide worden gedaan met ALTER TABLE
).
In SQL Server moeten sommige partitie-opties worden uitgevoerd met andere instructies. Het samenvoegen van partities wordt bijvoorbeeld gedaan met de ALTER PARTITION FUNCTION
statement, en het splitsen van partities wordt gedaan met het ALTER PARTITION SCHEME
verklaring.
Als u meer wilt weten over gepartitioneerde tabellen in SQL Server, kunt u als volgt een gepartitioneerde tabel maken in SQL Server.
ALTER TABLE
in SQLite
Ik moet ook vermelden dat SQLite een zeer beperkte ondersteuning heeft van de ALTER TABLE
uitspraak. In SQLite, de ALTER TABLE
Met de instructie kunt u de naam van een tabel wijzigen, een kolom binnen een tabel hernoemen of een nieuwe kolom aan een bestaande tabel toevoegen.
Voor alle andere wijzigingen moet u de tafel laten vallen en opnieuw beginnen. Dit geldt ook voor het toevoegen van externe sleutels.