Tworzenie relacji kluczy obcych
Dotyczy: SQL Server 2016 (13.x) i późniejsze wersje
Azure SQL Database
Azure SQL Managed Instance
SQL Database w usłudze Microsoft Fabric
W tym artykule opisano sposób tworzenia relacji kluczy obcych w programie SQL Server przy użyciu programu SQL Server Management Studio lub Języka Transact-SQL. Relację między dwiema tabelami można utworzyć, gdy chcesz skojarzyć wiersze jednej tabeli z wierszami innej.
Uprawnienia
Utworzenie nowej tabeli z kluczem obcym wymaga uprawnienia CREATE TABLE w bazie danych, a uprawnienie ALTER SCHEMA w schemacie, w którym jest tworzona tabela.
Utworzenie klucza obcego w istniejącej tabeli wymaga uprawnienia ALTER TABLE w tabeli.
Ograniczenia
Ograniczenie klucza obcego nie musi być połączone tylko z ograniczeniem klucza podstawowego w innej tabeli. Klucze obce można również zdefiniować tak, aby odwoływać się do kolumn ograniczenia
UNIQUE
w innej tabeli.Jeśli do kolumny ograniczenia
FOREIGN KEY
zostanie wprowadzona wartość inna niżNULL
, wartość musi istnieć w referencyjnej kolumnie. W przeciwnym razie zwracany jest komunikat o błędzie naruszenia klucza obcego. Aby upewnić się, że wszystkie wartości złożonego ograniczenia klucza obcego są weryfikowane, określNOT NULL
we wszystkich uczestniczących kolumnach.Ograniczenia
FOREIGN KEY
mogą odwoływać się do tabel tylko w tej samej bazie danych na tym samym serwerze. Integralność referencyjna między bazami danych musi być zaimplementowana za pośrednictwem wyzwalaczy. Aby uzyskać więcej informacji, zobacz CREATE TRIGGER (Transact-SQL).FOREIGN KEY
ograniczenia mogą odwoływać się do innej kolumny w tej samej tabeli i są określane jako odwołanie samodzielne.Ograniczenie
FOREIGN KEY
określone na poziomie kolumny może zawierać tylko jedną kolumnę odwołania. Ta kolumna musi mieć ten sam typ danych co kolumna, w której zdefiniowano ograniczenie.Ograniczenie
FOREIGN KEY
określone na poziomie tabeli musi mieć taką samą liczbę kolumn odwołań jak liczba kolumn na liście kolumn ograniczeń. Typ danych każdej kolumny odwołania musi być również taki sam jak odpowiednia kolumna na liście kolumn.Aparat bazy danych nie ma wstępnie zdefiniowanego limitu liczby ograniczeń
FOREIGN KEY
, które tabela może zawierać, które odwołują się do innych tabel. Silnik bazy danych nie ogranicza również liczby ograniczeńFOREIGN KEY
należących do innych tabel, które odwołują się do określonej tabeli. Jednak rzeczywista liczba używanych ograniczeńFOREIGN KEY
jest ograniczona przez konfigurację sprzętu oraz projekt bazy danych i aplikacji. Tabela może odwoływać się maksymalnie do 253 innych tabel i kolumn jako kluczy obcych (odwołania wychodzące). Program SQL Server 2016 (13.x) i nowsze wersje zwiększają limit liczby innych tabel i kolumn, które mogą odwoływać się do kolumn w pojedynczej tabeli (odwołania przychodzące), od 253 do 10 000. (Wymaga co najmniej 130 poziom kompatybilności). Zwiększenie ma następujące ograniczenia:Więcej niż 253 odwołań do kluczy obcych jest obsługiwanych w przypadku operacji DML
DELETE
iUPDATE
. OperacjeMERGE
nie są obsługiwane.Tabela, która ma odwołanie klucza obcego do samej siebie, jest nadal ograniczona do 253 takich odwołań.
Ponad 253 odwołania do kluczy obcych obecnie nie są obsługiwane dla indeksów magazynu kolumn ani tabel zoptymalizowanych pod kątem pamięci.
FOREIGN KEY
ograniczenia nie są wymuszane w tabelach tymczasowych.Jeśli klucz obcy jest zdefiniowany w kolumnie typu zdefiniowanego przez użytkownika CLR, implementacja typu musi obsługiwać porządkowanie binarne. Aby uzyskać więcej informacji, zobacz CLR Typy User-Defined.
Kolumna typu varchar(max) może uczestniczyć w ograniczeniu
FOREIGN KEY
tylko wtedy, gdy klucz podstawowy, do których się odwołuje, jest również zdefiniowany jako typ varchar(max).
Tworzenie relacji klucza obcego w projektancie tabel
Korzystanie z programu SQL Server Management Studio
W Eksploratorze obiektów kliknij prawym przyciskiem myszy tabelę, która będzie znajdować się po stronie klucza obcego relacji, a następnie wybierz pozycję Design.
Tabela zostanie otwarta w Tworzenie i aktualizowanie tabel bazy danych.
Z menu projektanta tabel wybierz pozycję relacje . (Zobacz menu Table Designer w nagłówku lub kliknij prawym przyciskiem myszy puste miejsce w definicji tabeli, a następnie wybierz pozycję Relacje....)
W oknie dialogowym relacje klucza obcego wybierz pozycję Dodaj.
Relacja jest wyświetlana na liście Selected Relationship z nazwą podaną przez system w formacie
FK_<tablename>_<tablename>
, gdzie pierwsza nazwa_tabeli jest nazwą tabeli kluczy obcych, a druga nazwa_tabeli jest nazwą tabeli kluczy podstawowych. Jest to tylko domyślna i typowa konwencja nazewnictwa dla pola (Nazwa) obiektu klucza obcego.Wybierz odpowiednią relację z listy Wybrana relacja.
Wybierz Specyfikacja tabel i kolumn w tabeli po prawej stronie i wybierz wielokropek (...) po prawej stronie właściwości.
W oknie dialogowym Tabele i Kolumny na liście rozwijanej Klucz Podstawowy wybierz tabelę, która będzie znajdować się po stronie klucza podstawowego relacji.
W siatce poniżej okna dialogowego wybierz kolumny składające się na klucz podstawowy tabeli. W sąsiedniej komórce siatki, po prawej stronie każdej kolumny, wybierz odpowiadającą jej kolumnę klucza obcego z tabeli kluczy obcych.
Projektant tabel sugeruje nazwę relacji. Aby zmienić tę nazwę, edytuj zawartość pola tekstowego Nazwa relacji.
Wybierz OK, aby utworzyć relację.
Zamknij okno projektanta tabel i zapisz zmiany w relacji klucza obcego, aby zaczęły obowiązywać.
Tworzenie klucza obcego w nowej tabeli
Użyj Transact-SQL
Poniższy przykład tworzy tabelę i definiuje ograniczenie klucza obcego w kolumnie TempID
odwołujące się do kolumny SalesReasonID
w tabeli Sales.SalesReason
w bazie danych AdventureWorks
. Klauzule ON DELETE CASCADE
i ON UPDATE CASCADE
są używane w celu zapewnienia, że zmiany wprowadzone w tabeli Sales.SalesReason
są automatycznie propagowane do tabeli Sales.TempSalesReason
.
CREATE TABLE Sales.TempSalesReason (
TempID INT NOT NULL,
Name NVARCHAR(50),
CONSTRAINT PK_TempSales
PRIMARY KEY NONCLUSTERED (TempID),
CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID)
REFERENCES Sales.SalesReason(SalesReasonID)
ON DELETE CASCADE
ON UPDATE CASCADE
);
Tworzenie klucza obcego w istniejącej tabeli
Użyj Transact-SQL
Poniższy przykład tworzy klucz obcy w kolumnie TempID
, i odwołuje się do kolumny SalesReasonID
w tabeli Sales.SalesReason
w bazie danych AdventureWorks
.
ALTER TABLE Sales.TempSalesReason
ADD CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID)
REFERENCES Sales.SalesReason (SalesReasonID)
ON DELETE CASCADE
ON UPDATE CASCADE;