Udostępnij za pośrednictwem


Tworzenie relacji kluczy obcych

Dotyczy: SQL Server 2016 (13.x) i późniejsze wersje Azure SQL DatabaseAzure SQL Managed InstanceSQL 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śl NOT 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 i UPDATE. Operacje MERGE 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

  1. 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.

  2. 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....)

  3. 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.

  4. Wybierz odpowiednią relację z listy Wybrana relacja.

  5. Wybierz Specyfikacja tabel i kolumn w tabeli po prawej stronie i wybierz wielokropek (...) po prawej stronie właściwości.

  6. 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.

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

  8. Wybierz OK, aby utworzyć relację.

  9. 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;