Tento článek ukazuje, jak přidat primární klíč do existující tabulky na serveru SQL Server pomocí Transact-SQL.
Primární klíč je sloupec, který byl nakonfigurován jako jedinečný identifikátor pro danou tabulku.
Obvykle byste při vytváření tabulky vytvořili omezení primárního klíče, ale můžete také přidat primární klíč do existující tabulky.
Všimněte si, že tabulka může mít pouze jeden primární klíč. Nemůžete tedy přidat primární klíč, pokud jej tabulka již má.
Také primární klíče lze přidat pouze do sloupců, které jsou definovány jako NOT NULL
.
Příklad 1 – Přidání omezení primárního klíče
V tomto příkladu vytvořím tabulku, ale zapomenu přidat omezení primárního klíče. Potom se vrátím a upravím tabulku tak, aby měla primární klíč.
Vytvořte tabulku (ale zapomeňte vytvořit primární klíč ):
USE Test; CREATE TABLE Colors ( ColorId int IDENTITY (1,1) NOT NULL, ColorName varchar(50) );
Výsledek:
Commands completed successfully. Total execution time: 00:00:00.058
Jejda – zapomněl jsem vytvořit primární klíč!
Žádný problém! Nyní můžeme jeden přidat:
ALTER TABLE Colors ADD CONSTRAINT PK_Colors_ColorId PRIMARY KEY CLUSTERED (ColorId);
Výsledek:
Commands completed successfully. Total execution time: 00:00:00.031
To nyní přidal PRIMARY KEY
omezení pro ColorId
sloupec.
Příklad 2 – Zkontrolujte omezení primárního klíče
Spusťte následující kód, který vrátí seznam omezení primárního klíče v databázi:
SELECT name, type, unique_index_id, is_system_named FROM sys.key_constraints WHERE type = 'PK';
Výsledek:
+------------------------------+--------+-------------------+-------------------+ | name | type | unique_index_id | is_system_named | |------------------------------+--------+-------------------+-------------------| | PK__MyTest__606C418F16F9CCCF | PK | 1 | 1 | | PK__Client__96ADCE1ACB91C2A9 | PK | 1 | 1 | | PK_Colors_ColorId | PK | 1 | 0 | +------------------------------+--------+-------------------+-------------------+
Vaše výsledky se budou lišit v závislosti na primárních klíčích ve vaší databázi.
Všimněte si také, že toto systémové zobrazení vrací více sloupců, než jsem zde uvedl, ale můžete použít *
zástupný znak, chcete-li vrátit všechny sloupce.
Příklad 3 – Přidání primárního klíče do sloupce, který umožňuje hodnoty NULL
Primární klíč lze přidat pouze do sloupců, které jsou definovány jako NOT NULL
. Pokud se pokusíte přidat primární klíč do sloupce, který má hodnotu null, zobrazí se chyba.
Abychom to demonstrovali, vytvořte další tabulku, ale tentokrát také zapomeneme zadat sloupec jako NOT NULL
:
USE Test; CREATE TABLE Colors2 ( ColorId int, ColorName varchar(50) );
Můžeme spustit následující dotaz a zkontrolovat, zda sloupec povoluje hodnoty null nebo ne:
SELECT t.name AS 'Table', c.name AS 'Column', c.is_nullable, c.is_identity FROM sys.columns c INNER JOIN sys.tables T ON c.object_id = t.object_id WHERE c.name = 'ColorId';
Výsledek:
+---------+----------+---------------+---------------+ | Table | Column | is_nullable | is_identity | |---------+----------+---------------+---------------| | Colors | ColorId | 0 | 1 | | Colors2 | ColorId | 1 | 0 | +---------+----------+---------------+---------------+
Můžeme vidět, že ten, který jsme vytvořili dříve (v Colors
table) má hodnotu null a jedná se o sloupec identity. Druhý (v Colors2
table) má hodnotu null a nejedná se o sloupec identity.
Nyní se pokusíme přidat omezení primárního klíče do sloupce s možnou hodnotou Null:
ALTER TABLE Colors2 ADD CONSTRAINT PK_Colors2_ColorId PRIMARY KEY CLUSTERED (ColorId);
Výsledek:
Msg 8111, Level 16, State 1, Line 1 Cannot define PRIMARY KEY constraint on nullable column in table 'Colors2'. Msg 1750, Level 16, State 0, Line 1 Could not create constraint or index. See previous errors.
V tomto případě tedy budeme muset změnit sloupec tak, aby byl NOT NULL
než se jej pokusíme definovat jako primární klíč.
Můžeme použít ALTER COLUMN
v ALTER TABLE
příkaz k nastavení tohoto sloupce na NOT NULL
:
ALTER TABLE Colors2 ALTER COLUMN ColorId int NOT NULL;
Podívejme se znovu na sloupec:
SELECT t.name AS 'Table', c.name AS 'Column', c.is_nullable, c.is_identity FROM sys.columns c INNER JOIN sys.tables T ON c.object_id = t.object_id WHERE c.name = 'ColorId';
Výsledek:
+---------+----------+---------------+---------------+ | Table | Column | is_nullable | is_identity | |---------+----------+---------------+---------------| | Colors | ColorId | 0 | 1 | | Colors2 | ColorId | 0 | 0 | +---------+----------+---------------+---------------+
Takže vidíme, že Colors2
je nyní nastaven na 0
, což znamená, že nemá hodnotu null (nemůže obsahovat hodnoty NULL).
Nezapomeňte také, že sloupec není sloupec identity. Proberu to později.
Nyní, když je sloupec definován jako NOT NULL
můžeme pokračovat a přidat primární klíč:
ALTER TABLE Colors2 ADD CONSTRAINT PK_Colors2_ColorId PRIMARY KEY CLUSTERED (ColorId);
Výsledek:
Commands completed successfully. Total execution time: 00:00:00.048
Pro ověření znovu zkontrolujte všechna omezení primárního klíče pro tuto tabulku:
SELECT name, type, unique_index_id, is_system_named FROM sys.key_constraints WHERE type = 'PK';
Výsledek:
+------------------------------+--------+-------------------+-------------------+ | name | type | unique_index_id | is_system_named | |------------------------------+--------+-------------------+-------------------| | PK__MyTest__606C418F16F9CCCF | PK | 1 | 1 | | PK__Client__96ADCE1ACB91C2A9 | PK | 1 | 1 | | PK_Colors_ColorId | PK | 1 | 0 | | PK_Colors2_ColorId | PK | 1 | 0 | +------------------------------+--------+-------------------+-------------------+
Náš nový primární klíč, který jsme nazvali PK_Colors2_ColorId
byl přidán do seznamu.
Příklad 4 – Změna sloupce na sloupec identity
Primární klíče jsou často aplikovány na sloupce identity. Sloupce identity jsou jako takové definovány pomocí IDENTITY
klíčové slovo, za nímž následuje volitelná počáteční a přírůstková hodnota v závorkách.
Když je do tabulky přidán nový řádek, SQL Server poskytuje jedinečnou přírůstkovou hodnotu pro sloupec identity.
Pokud plánujete používat sloupec identity, musíte to již udělat. Stávající sloupec nelze změnit na sloupec identity.
Když jsem dříve spustil dotaz, viděli jsme, že Colors2.ColorId
sloupec není sloupec identity (známe to, protože is_identity
je nastaven na 0
). To znamená, že jsem vytvořil PK_Colors2_ColorId
primární klíč ve sloupci bez identity.
Zde je to, co se stane, když se pokusíme změnit tabulku tak, aby byla sloupcem identity:
ALTER TABLE Colors2 ALTER COLUMN ColorId int IDENTITY (1,1) NOT NULL PRIMARY KEY;
Výsledek:
Msg 156, Level 15, State 1, Line 3 Incorrect syntax near the keyword 'IDENTITY'.
Jak již bylo zmíněno, abychom to překonali, musíme sloupec zahodit a začít znovu.
Pokud sloupec již obsahuje data, budete muset udělat nějakou práci navíc. To je mimo rozsah tohoto článku, ale zde je příklad zrušení výše uvedeného sloupce a jeho opětovného vytvoření jako sloupce identity:
USE Test; DROP TABLE Colors2; CREATE TABLE Colors2 ( ColorId int IDENTITY (1,1) NOT NULL PRIMARY KEY, ColorName varchar(50) );
Výsledek:
Commands completed successfully. Total execution time: 00:00:00.049
Všimněte si, že jsem tentokrát neuvedl název omezení primárního klíče. V tomto případě pro něj systém vytvoří název.
Rychle zkontrolujte sloupec:
SELECT t.name AS 'Table', c.name AS 'Column', c.is_nullable, c.is_identity FROM sys.columns c INNER JOIN sys.tables T ON c.object_id = t.object_id WHERE c.name = 'ColorId';
Výsledek:
+---------+----------+---------------+---------------+ | Table | Column | is_nullable | is_identity | |---------+----------+---------------+---------------| | Colors | ColorId | 0 | 1 | | Colors2 | ColorId | 0 | 1 | +---------+----------+---------------+---------------+
Ano, nyní je to sloupec identity.
Podívejme se znovu na primární klíče pro tuto tabulku:
SELECT name, type, unique_index_id, is_system_named FROM sys.key_constraints WHERE type = 'PK';
Výsledek:
+-------------------------------+--------+-------------------+-------------------+ | name | type | unique_index_id | is_system_named | |-------------------------------+--------+-------------------+-------------------| | PK__MyTest__606C418F16F9CCCF | PK | 1 | 1 | | PK__Client__96ADCE1ACB91C2A9 | PK | 1 | 1 | | PK_Colors_ColorId | PK | 1 | 0 | | PK__Colors2__8DA7674D8F57294D | PK | 1 | 1 | +-------------------------------+--------+-------------------+-------------------+
Nyní tedy máme systémově pojmenovaný primární klíč s názvem PK__Colors2__8DA7674D8F57294D
.