sql >> Databáze >  >> RDS >> Sqlserver

Jak přidat primární klíč do existující tabulky na serveru SQL (příklady T-SQL)

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 .


  1. Android - Zobrazení uživatelského jména z databáze sqlite po přihlášení v textView

  2. Jak nainstalovat SQLOPS na Mac

  3. Zdarma webhosting s podporou PHP

  4. Aktualizujte jednu tabulku MySQL hodnotami z jiné