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
.