sql >> Databáze >  >> RDS >> Database

SQL ALTER TABLE pro začátečníky

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říklad ADD následovaný názvem a definicí sloupce nebo DROP 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íčů.


  1. Jaký je rozdíl mezi použitím INDEX vs KEY v MySQL?

  2. 10 SP_EXECUTESQL Pro lepší dynamické SQL je třeba se vyhnout

  3. Zabraňuje SELECT FOR UPDATE vkládání dalších připojení, když řádek není přítomen?

  4. Kód chyby:1406. Data jsou pro sloupec příliš dlouhá – MySQL