Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak dodać klucz podstawowy do istniejącej tabeli w SQL Server (przykłady T-SQL)

W tym artykule pokazano, jak dodać klucz podstawowy do istniejącej tabeli w programie SQL Server przy użyciu języka Transact-SQL.

Klucz podstawowy to kolumna, która została skonfigurowana jako unikalny identyfikator dla danej tabeli.

Zwykle tworzysz ograniczenie klucza podstawowego podczas tworzenia tabeli, ale możesz także dodać klucz podstawowy do istniejącej tabeli.

Zauważ, że tabela może mieć tylko jeden klucz podstawowy. Nie możesz więc dodać klucza podstawowego, jeśli tabela już go ma.

Również klucze podstawowe można dodawać tylko do kolumn, które są zdefiniowane jako NOT NULL .

Przykład 1 – Dodaj ograniczenie klucza podstawowego

W tym przykładzie tworzę tabelę, ale zapominam dodać ograniczenie klucza podstawowego. Więc wracam i zmieniam tabelę, aby miała klucz podstawowy.

Utwórz tabelę (ale zapomnij o utworzeniu klucza podstawowego ):

USE Test;

CREATE TABLE Colors
(
    ColorId int IDENTITY (1,1) NOT NULL,
    ColorName varchar(50)
);

Wynik:

Commands completed successfully.
Total execution time: 00:00:00.058

Ups – zapomniałem utworzyć klucz podstawowy!

Nie ma problemu! Możemy go teraz dodać:

ALTER TABLE Colors
ADD CONSTRAINT PK_Colors_ColorId PRIMARY KEY CLUSTERED (ColorId);

Wynik:

Commands completed successfully.
Total execution time: 00:00:00.031

Teraz dodano PRIMARY KEY ograniczenie dla ColorId kolumna.

Przykład 2 – Sprawdź ograniczenie klucza podstawowego

Uruchommy następujący kod, aby zwrócić listę ograniczeń klucza podstawowego w bazie danych:

SELECT
  name,
  type,
  unique_index_id,
  is_system_named
FROM sys.key_constraints
WHERE type = 'PK';

Wynik:

+------------------------------+--------+-------------------+-------------------+
| 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                 |
+------------------------------+--------+-------------------+-------------------+

Twoje wyniki będą się różnić w zależności od kluczy podstawowych w Twojej bazie danych.

Zwróć też uwagę, że ten widok systemowy zwraca więcej kolumn niż to, co tutaj określiłem, ale możesz użyć * symbol wieloznaczny, aby zwrócić wszystkie kolumny, jeśli chcesz.

Przykład 3 – Dodawanie klucza głównego do kolumny, która pozwala na wartości NULL

Klucz podstawowy można dodać tylko do kolumn, które są zdefiniowane jako NOT NULL . Jeśli spróbujesz dodać klucz podstawowy do kolumny, która może zawierać wartość null, pojawi się błąd.

Aby to zademonstrować, stwórzmy kolejną tabelę, ale tym razem zapomnimy również określić kolumnę jako NOT NULL :

USE Test;

CREATE TABLE Colors2
(
    ColorId int,
    ColorName varchar(50)
);

Możemy uruchomić następujące zapytanie, aby sprawdzić, czy kolumna dopuszcza wartości null, czy nie:

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';

Wynik:

+---------+----------+---------------+---------------+
| Table   | Column   | is_nullable   | is_identity   |
|---------+----------+---------------+---------------|
| Colors  | ColorId  | 0             | 1             |
| Colors2 | ColorId  | 1             | 0             |
+---------+----------+---------------+---------------+

Widzimy, że ten, który stworzyliśmy wcześniej (w Colors table) dopuszcza wartość null i jest kolumną tożsamości. Drugi (w Colors2 table) nie może zawierać wartości null i nie jest kolumną tożsamości.

Teraz spróbujmy dodać ograniczenie klucza podstawowego do kolumny dopuszczającej wartość null:

ALTER TABLE Colors2
ADD CONSTRAINT PK_Colors2_ColorId PRIMARY KEY CLUSTERED (ColorId);

Wynik:

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.

W tym przypadku musimy zmienić kolumnę na NOT NULL zanim spróbujemy zdefiniować go jako klucz podstawowy.

Możemy użyć ALTER COLUMN wewnątrz ALTER TABLE oświadczenie, aby ustawić tę kolumnę na NOT NULL :

ALTER TABLE Colors2
ALTER COLUMN ColorId int NOT NULL;

Sprawdźmy ponownie kolumnę:

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';

Wynik:

+---------+----------+---------------+---------------+
| Table   | Column   | is_nullable   | is_identity   |
|---------+----------+---------------+---------------|
| Colors  | ColorId  | 0             | 1             |
| Colors2 | ColorId  | 0             | 0             |
+---------+----------+---------------+---------------+

Widzimy więc, że Colors2 jest teraz ustawiony na 0 , co oznacza, że ​​nie może zawierać wartości NULL (nie może zawierać wartości NULL).

Pamiętaj też, że kolumna nie kolumna tożsamości. Omówię to później.

W każdym razie, teraz, gdy kolumna jest zdefiniowana jako NOT NULL możemy iść dalej i dodać klucz podstawowy:

ALTER TABLE Colors2
ADD CONSTRAINT PK_Colors2_ColorId PRIMARY KEY CLUSTERED (ColorId);

Wynik:

Commands completed successfully.
Total execution time: 00:00:00.048

Aby to zweryfikować, ponownie sprawdźmy wszystkie ograniczenia klucza podstawowego dla tej tabeli:

SELECT
  name,
  type,
  unique_index_id,
  is_system_named
FROM sys.key_constraints
WHERE type = 'PK';

Wynik:

+------------------------------+--------+-------------------+-------------------+
| 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                 |
+------------------------------+--------+-------------------+-------------------+

Nasz nowy klucz podstawowy, który nazwaliśmy PK_Colors2_ColorId został dodany do listy.

Przykład 4 – Zmiana kolumny na kolumnę tożsamości

Klucze podstawowe są często stosowane do kolumn tożsamości. Kolumny tożsamości są definiowane jako takie za pomocą IDENTITY słowo kluczowe, po którym następuje opcjonalny inicjator i wartość przyrostu w nawiasach.

Po dodaniu nowego wiersza do tabeli SQL Server zapewnia unikatową, przyrostową wartość kolumny tożsamości.

Jeśli planujesz używać kolumny tożsamości, musisz to już zrobić. Nie możesz zmienić istniejącej kolumny na kolumnę tożsamości.

Kiedy uruchomiłem zapytanie wcześniej, mogliśmy zobaczyć, że Colors2.ColorId kolumna nie kolumna tożsamości (wiemy o tym, ponieważ is_identity jest ustawiony na 0 ). Oznacza to, że utworzyłem PK_Colors2_ColorId klucz podstawowy w kolumnie innej niż tożsamość.

Oto, co się stanie, jeśli spróbujemy zmienić tabelę tak, aby była kolumną tożsamości:

ALTER TABLE Colors2
ALTER COLUMN 
  ColorId int IDENTITY (1,1) NOT NULL PRIMARY KEY;

Wynik:

Msg 156, Level 15, State 1, Line 3
Incorrect syntax near the keyword 'IDENTITY'.

Jak wspomniano, aby to przezwyciężyć, musimy opuścić kolumnę i zacząć od nowa.

Jeśli kolumna zawiera już dane, będziesz musiał wykonać dodatkową pracę. To wykracza poza zakres tego artykułu, ale oto przykład upuszczenia powyższej kolumny i odtworzenia jej jako kolumny tożsamości:

USE Test; 

DROP TABLE Colors2;

CREATE TABLE Colors2
(
    ColorId int IDENTITY (1,1) NOT NULL PRIMARY KEY,
    ColorName varchar(50)
);

Wynik:

Commands completed successfully.
Total execution time: 00:00:00.049

Zauważ, że tym razem nie podałem nazwy dla ograniczenia klucza podstawowego. W takim przypadku system utworzy dla niego nazwę.

Szybko sprawdź kolumnę:

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';

Wynik:

+---------+----------+---------------+---------------+
| Table   | Column   | is_nullable   | is_identity   |
|---------+----------+---------------+---------------|
| Colors  | ColorId  | 0             | 1             |
| Colors2 | ColorId  | 0             | 1             |
+---------+----------+---------------+---------------+

Tak, teraz jest to kolumna tożsamości.

Przyjrzyjmy się jeszcze raz kluczom podstawowym w tej tabeli:

SELECT
  name,
  type,
  unique_index_id,
  is_system_named
FROM sys.key_constraints
WHERE type = 'PK';

Wynik:

+-------------------------------+--------+-------------------+-------------------+
| 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                 |
+-------------------------------+--------+-------------------+-------------------+

Mamy więc teraz klucz podstawowy o nazwie systemowej o nazwie PK__Colors2__8DA7674D8F57294D .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Grupy dostępności programu SQL Server AlwaysOn:instalacja i konfiguracja, część 1

  2. Jak usunąć właściwość tożsamości kolumny w tabeli SQL Server — samouczek SQL Server / T-SQL 44

  3. procedury składowane z sqlAlchemy

  4. Wyzwalacz zapobiegający wstawianiu dla zduplikowanych danych dwóch kolumn

  5. Jak przenieść lub wyeksportować dane SQL Server 2005 do Excela?