V SQL, ALTER TABLE
příkaz upravuje definici existující tabulky.
Můžete použít ALTER TABLE
pro změnu, přidání nebo zrušení sloupců a omezení.
V závislosti na vašem DBMS, ALTER TABLE
příkaz lze také použít k přeřazení a přestavbě oddílů nebo k deaktivaci a povolení omezení a spouštěčů.
Syntaxe
ALTER TABLE
prohlášení obecně vypadá takto:
ALTER TABLE table_name
[alter_option [, alter_option] ...]
[partition_options]
Kde:
table_name
je název tabulky, kterou chcete změnit.[alter_option [, alter_option] …]
je seznam konkrétních změn, které chcete provést (napříkladADD
následovaný názvem a definicí sloupce neboDROP COLUMN
následovaný názvem sloupce atd.).[partition_options]
je volitelný seznam voleb speciálně pro dělené tabulky. Ne všechny DBMS podporují dělené tabulky. Pokud to děláte vy, mohou vám takové možnosti umožnit přidávat, rušit, zahazovat, importovat, slučovat nebo rozdělovat oddíly nebo provádět údržbu oddílů.
Úplná syntaxe pro ALTER TABLE
může být poměrně složitý a mezi DBMS se výrazně liší. Cokoli, co není uvedeno v tomto článku, najdete v dokumentaci DBMS.
Níže jsou uvedeny příklady nejběžnějších ALTER TABLE
operace.
Přidat nový sloupec
Chcete-li do tabulky přidat nový sloupec, použijte ADD
klauzule následovaná názvem sloupce a datovým typem.
ALTER TABLE Products
ADD ProductDescription varchar(500);
Tím se přidá nový sloupec s názvem ProductDescription
do Products
tabulka.
V tomto příkladu jsme vytvořili sloupec varchar(500)
ale použili byste jakýkoli typ dat, který je vhodný pro váš nový sloupec.
Do definice sloupce můžete také zahrnout omezení, ale to může záviset na vašem DBMS a na tom, zda tabulka již obsahuje data (viz níže uvedená diskuze).
Přejmenovat sloupec
Většina hlavních RDBMS (PostgreSQL, Oracle, SQLite, MySQL 8.0+, MariaDB 10.5.2+) umožňuje přejmenovat sloupec takto:
ALTER TABLE table_name
RENAME COLUMN column_name TO new_column_name;
Pokud používáte MySQL starší než verze 8.0 nebo MariaDB starší než 10.5.2+, budete muset použít CHANGE COLUMN
místo toho syntaxe, která také vyžaduje, abyste specifikovali datový typ. Asi takto:
ALTER TABLE table_name
CHANGE COLUMN old_column_name new_column_name datatype;
V SQL Serveru budete muset použít sp_rename
uložená procedura k přejmenování sloupce. Takhle:
EXEC sp_rename 'schema_name.table_name.column_name', 'new_column_name', 'COLUMN';
Přetáhněte sloupec
Chcete-li sloupec zrušit, použijte DROP COLUMN
klauzule následovaná názvem sloupce.
ALTER TABLE table_name
DROP COLUMN column_name;
Upravit definici sloupce
Syntaxe pro úpravu definice existujícího sloupce se mezi DBMS výrazně liší. Záleží také na tom, jaké úpravy potřebujete provést.
Aby to bylo jednoduché, proveďte jednoduchou úpravu sloupce na serveru SQL:
ALTER TABLE Products
ALTER COLUMN ProductDescription varchar(1000);
V tomto příkladu jsme změnili ProductDescription
sloupec z varchar(500)
na varchar(1000)
.
Níže je uvedena základní syntaxe vyžadovaná každým DBMS k provedení stejných nebo podobných změn.
SQL Server:
ALTER TABLE table_name
ALTER COLUMN column_name datatype;
PostgreSQL:
ALTER TABLE table_name
ALTER COLUMN column_name TYPE datatype;
MySQL, MariaDB a Oracle starší než 10g:
ALTER TABLE table_name
MODIFY COLUMN column_name datatype;
V Oracle 10g a novějších:
ALTER TABLE table_name
MODIFY column_name datatype;
SQLite vám nedovolí upravit sloupec jinak, než jej přejmenovat.
Skutečná syntaxe pro každý DBMS je obvykle mnohem složitější než toto a závisí přesně na tom, co se snažíte udělat. Tím byste však měli začít se základními úpravami sloupců.
Omezení a úvahy
Obecně byste se měli vyvarovat provádění úprav tabulek, jakmile obsahují data. Provedením změn riskujete ztrátu stávajících dat.
Přesto vám mnoho DBMS ve skutečnosti brání v provádění určitých změn, jakmile tabulka obsahuje data. Můžete například zjistit, že nemůžete přidat NOT NULL
omezení na sloupec, který obsahuje data.
Některé DBMS vám to mohou umožnit, pokud používáte DEFAULT
omezení (pro poskytnutí výchozí hodnoty pro sloupce, do kterých nebyla explicitně vložena data), nebo sloupec Identity/autoincrement nebo sloupec časového razítka atd.
Některé DBMS neumožňují rušit nebo měnit sloupce v tabulce.
Některé DBMS také omezují datové typy, které lze přidat.
Příklad – Přidání omezení NOT NULL
Zde je příklad, který vám pomůže demonstrovat výše uvedené body.
Zde je to, co se stane, když se pokusím přidat sloupec s NOT NULL
omezení na serveru SQL.
ALTER TABLE Products
ADD ProductDescription varchar(500) NOT NULL;
Výsledek:
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.
V podstatě tabulka již obsahuje data, a tak SQL Server vrací chybu, která mi říká, že mohu přidat pouze NOT NULL
omezení, pokud tabulka splňuje určitá kritéria a tato kritéria ještě nesplňuje.
A pro tato kritéria existuje dobrý důvod.
A NOT NULL
omezení zajišťuje, že neexistují žádné NULL
hodnoty ve sloupci v libovolném řádku. Problém je v tom, že data již v tabulce máme, a pokud přidáme nový sloupec, tyto existující řádky budou NULL
– což okamžitě poruší naše NOT NULL
omezení. Potřebujeme tedy specifikovat data, která se mají přesunout do existujících řádků.
K tomu můžeme přidat DEFAULT
omezení nebo podobné, abyste zajistili, že všechny existující řádky budou automaticky vyplněny daty v tomto sloupci.
Příklad:
ALTER TABLE Products
ADD ProductDescription varchar(500) NOT NULL DEFAULT 'N/A';
To jednoduše přidá DEFAULT
omezení na sloupec. Toto omezení zajišťuje, že všechny řádky obsahují hodnotu (v tomto případě je hodnota N/A
), pokud jim nebyla přiřazena hodnota. To znamená, že naše NOT NULL
omezení nebude porušeno, protože všechny existující řádky budou nyní obsahovat hodnotu.
Pokud nový sloupec potřebuje mít jedinečné, zvyšující se hodnoty, můžete z něj místo toho vytvořit IDENTITY
(nebo AUTOINCREMENT
v SQLite a dalších DBMS).
Pokud však tabulka ještě data neobsahuje, můžete sloupec přidat, aniž byste museli provést některý z těchto kroků.
Možnosti rozdělení
Tento článek je zaměřen na začátečníky a rozdělené tabulky jsou trochu mimo oblast výukového programu pro začátečníky.
Poté, co jsem to řekl, rychle projdu některé možnosti rozdělení s ohledem na ALTER TABLE
prohlášení.
Pokud váš DBMS podporuje dělené tabulky, pravděpodobně také poskytuje možnosti rozdělení pomocí ALTER TABLE
prohlášení.
Například v MySQL můžete provést následující:
ALTER TABLE Products
PARTITION BY HASH(ProductId)
PARTITIONS 8;
Toto rozdělí tabulku na 8 oblastí pomocí HASH
pomocí ProductId
sloupec jako rozdělovací klíč.
PARTITION BY HASH
používá zbytek výrazu (v tomto případě ProductId
sloupec) děleno počtem oddílů (tj. modulem).
Můžete také použít oddíly rozsahu. Zde je návod, jak přidat oblast rozsahu do existující tabulky:
ALTER TABLE Products
ADD PARTITION (PARTITION Partition9 VALUES LESS THAN (2020));
Tento příklad naznačuje, že Products
tabulka již má 8 oblastí rozsahu a přidáváme další oddíl s názvem Partition9
.
Oddíly můžete zrušit takto:
ALTER TABLE Products
DROP PARTITION Partition8, Partition9;
Mějte na paměti, že tyto příklady jsou pro MySQL.
Napsal jsem také několik článků o rozdělených tabulkách na SQL Server. S ohledem na ALTER TABLE
zde je návod, jak přepnout oddíl a zde je návod, jak přepnout v oddílu (obojí se provádí pomocí ALTER TABLE
).
V SQL Server je třeba provést některé možnosti oddílu s jinými příkazy. Například slučování oddílů se provádí pomocí ALTER PARTITION FUNCTION
a rozdělení oddílů se provádí pomocí ALTER PARTITION SCHEME
prohlášení.
Pokud se chcete dozvědět více o dělených tabulkách na SQL Serveru, zde je návod, jak vytvořit dělenou tabulku na SQL Serveru.
ALTER TABLE
v SQLite
Měl bych také zmínit, že SQLite má velmi omezenou podporu ALTER TABLE
prohlášení. V SQLite, ALTER TABLE
umožňuje přejmenovat tabulku, přejmenovat sloupec v tabulce nebo přidat nový sloupec do existující tabulky.
Jakékoli další změny budou vyžadovat, abyste opustili stůl a začali znovu. To platí také pro přidávání cizích klíčů.