Tworzenie kluczy podstawowych
Dotyczy: SQL Server 2016 (13.x) i nowsze wersje
Azure SQL Database
Azure SQL Managed Instance
SQL Database w usłudze Microsoft Fabric
Klucz podstawowy można zdefiniować w aparacie silnika bazy danych SQL Server, używając programu SQL Server Management Studio lub języka Transact-SQL. Utworzenie klucza podstawowego powoduje automatyczne utworzenie odpowiedniego unikatowego indeksu klastrowanego. Klucz podstawowy można jednak określić jako indeks nieklastrowany.
Przykłady kodu w tym artykule korzystają z przykładowej bazy danych AdventureWorks2022
lub AdventureWorksDW2022
, którą można pobrać ze strony głównej Przykładów programu Microsoft SQL Server i projektów społeczności.
Ograniczenia
Tabela może zawierać tylko jedno ograniczenie PRIMARY KEY
.
Wszystkie kolumny zdefiniowane w ramach ograniczenia PRIMARY KEY
muszą być zdefiniowane jako NOT NULL
. Jeśli nie określono wartości null, wszystkie kolumny uczestniczące w ograniczeniu PRIMARY KEY
mają ustawioną wartość null na wartość NOT NULL
.
Uprawnienia
Utworzenie nowej tabeli z kluczem podstawowym wymaga uprawnień CREATE TABLE
w bazie danych i ALTER
uprawnienia do schematu, w którym jest tworzona tabela.
Utworzenie klucza podstawowego w istniejącej tabeli wymaga posiadania uprawnień ALTER
do tabeli.
Korzystanie z programu SQL Server Management Studio
- W Eksploratorze obiektów kliknij prawym przyciskiem myszy tabelę, do której chcesz dodać unikatowe ograniczenie, a następnie wybierz pozycję Design.
- W Projektant tabelwybierz selektor wierszy dla kolumny bazy danych, którą chcesz zdefiniować jako klucz podstawowy. Jeśli chcesz wybrać wiele kolumn, przytrzymaj wciśnięty CTRL podczas wybierania selektorów wierszy dla innych kolumn.
- Kliknij prawym przyciskiem myszy selektor wierszy dla kolumny i wybierz pozycję Ustaw klucz podstawowy.
Ostrożność
Jeśli chcesz ponownie zdefiniować klucz podstawowy, przed utworzeniem nowego klucza podstawowego należy usunąć wszystkie relacje z istniejącym kluczem podstawowym. Zostanie wyświetlony komunikat z ostrzeżeniem, że istniejące relacje zostaną automatycznie usunięte w ramach tego procesu.
Kolumna klucza podstawowego jest identyfikowana przez symbol klucza podstawowego w selektorze wierszy.
Jeśli klucz podstawowy składa się z więcej niż jednej kolumny, zduplikowane wartości są dozwolone w jednej kolumnie, ale każda kombinacja wartości ze wszystkich kolumn w kluczu podstawowym musi być unikatowa.
Jeśli zdefiniujesz klucz złożony, kolejność kolumn w kluczu podstawowym jest zgodna z kolejnością kolumn, jak pokazano w tabeli. Można jednak zmienić kolejność kolumn po utworzeniu klucza podstawowego. Aby uzyskać więcej informacji, zobacz Modyfikowanie kluczy podstawowych.
Użyj Transact-SQL
Tworzenie klucza podstawowego w istniejącej tabeli
Poniższy przykład tworzy klucz podstawowy w kolumnie TransactionID
w bazie danych AdventureWorks2022
.
ALTER TABLE [Production].[TransactionHistoryArchive]
ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID PRIMARY KEY CLUSTERED (TransactionID);
Tworzenie klucza podstawowego w nowej tabeli
Poniższy przykład tworzy tabelę i definiuje klucz podstawowy w kolumnie TransactionID
w bazie danych AdventureWorks2022
.
CREATE TABLE [Production].[TransactionHistoryArchive1] (
TransactionID INT IDENTITY(1, 1) NOT NULL,
CONSTRAINT PK_TransactionHistoryArchive1_TransactionID PRIMARY KEY CLUSTERED (TransactionID)
);
Tworzenie nieklastrowanego klucza podstawowego z oddzielnym indeksem klastrowanym w nowej tabeli
Poniższy przykład tworzy tabelę w bazie danych AdventureWorks2022
z nieklastrowym kluczem podstawowym w kolumnie CustomerID
. Następnie dodaje indeks klastrowany w TransactionID
.
Utwórz tabelę, aby dodać indeks klastrowany.
CREATE TABLE [Production].[TransactionHistoryArchive1] ( CustomerID UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID(), TransactionID INT IDENTITY(1, 1) NOT NULL, CONSTRAINT PK_TransactionHistoryArchive1_CustomerID PRIMARY KEY NONCLUSTERED (CustomerID) );
Teraz dodaj indeks klastrowany.
CREATE CLUSTERED INDEX CIX_TransactionID ON [Production].[TransactionHistoryArchive1] (TransactionID);