sql >> Database >  >> RDS >> Database

SQL ALTER TABLE voor beginners

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 (bijvoorbeeld ADD gevolgd door de kolomnaam en definitie, of DROP 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.


  1. Android SQLiteDB is niet klaar met het toevoegen van waarden

  2. 5 manieren om de naam van de korte maand van een datum in SQL Server te krijgen

  3. Hoe een rij in SQLite te krijgen op index (niet op id)

  4. Hoe kan ik een PostgreSQL-trigger gebruiken om wijzigingen op te slaan (SQL-statements en rijwijzigingen)