Delen via


Relaties met buitenlandse sleutels maken

Van toepassing op: SQL Server 2016 (13.x) en latere versies Azure SQL DatabaseAzure SQL Managed InstanceSQL-database in Microsoft Fabric

In dit artikel wordt beschreven hoe u relaties met buitenlandse sleutels maakt in SQL Server met behulp van SQL Server Management Studio of Transact-SQL. U maakt een relatie tussen twee tabellen wanneer u rijen van de ene tabel wilt koppelen aan rijen van een andere tabel.

Machtigingen

Voor het maken van een nieuwe tabel met een buitenlandse sleutel is toestemming CREATE TABLE in de database vereist en toestemming ALTER SCHEMA voor het schema waarin de tabel wordt gemaakt.

Voor het maken van een vreemde sleutel in een bestaande tabel is ALTER TABLE machtiging op de tabel vereist.

Beperkingen

  • Een beperking voor vreemde sleutels hoeft niet alleen te worden gekoppeld aan een primaire sleutelbeperking in een andere tabel. Vreemde sleutels kunnen ook worden gedefinieerd om te verwijzen naar de kolommen van een UNIQUE restrictie in een andere tabel.

  • Wanneer een andere waarde dan NULL wordt ingevoerd in de kolom van een FOREIGN KEY beperking, moet de waarde bestaan in de kolom waarnaar wordt verwezen. Anders wordt een foutmelding over schending van de vreemde sleutel geretourneerd. Als u ervoor wilt zorgen dat alle waarden van een beperking voor een samengestelde vreemde sleutel worden geverifieerd, specificeert u NOT NULL op alle deelnemende kolommen.

  • FOREIGN KEY beperkingen kunnen alleen verwijzen naar tabellen binnen dezelfde database op dezelfde server. Referentiële integriteit tussen databases moet worden geïmplementeerd via triggers. Zie CREATE TRIGGER (Transact-SQL)voor meer informatie.

  • FOREIGN KEY beperkingen kunnen verwijzen naar een andere kolom in dezelfde tabel en ook wel een zelfverwijzing genoemd.

  • Een FOREIGN KEY beperking die is opgegeven op kolomniveau kan slechts één verwijzingskolom weergeven. Deze kolom moet hetzelfde gegevenstype hebben als de kolom waarop de beperking is gedefinieerd.

  • Een FOREIGN KEY beperking die is opgegeven op tabelniveau, moet hetzelfde aantal referentiekolommen hebben als het aantal kolommen in de lijst met kolommen met beperkingen. Het gegevenstype van elke verwijzingskolom moet ook hetzelfde zijn als de bijbehorende kolom in de kolomlijst.

  • De database-engine heeft geen vooraf gedefinieerde limiet voor het aantal FOREIGN KEY beperkingen die een tabel kan bevatten die naar andere tabellen verwijzen. De database-engine beperkt ook niet het aantal FOREIGN KEY beperkingen die eigendom zijn van andere tabellen die verwijzen naar een specifieke tabel. Het werkelijke aantal FOREIGN KEY beperkingen wordt echter beperkt door de hardwareconfiguratie en door het ontwerp van de database en toepassing. Een tabel kan verwijzen naar maximaal 253 andere tabellen en kolommen als refererende sleutels (uitgaande verwijzingen). SQL Server 2016 (13.x) en latere versies verhogen de limiet voor het aantal andere tabellen en kolommen dat kan verwijzen naar kolommen in één tabel (binnenkomende verwijzingen), van 253 tot 10.000. (Vereist ten minste 130 compatibiliteitsniveau.) De verhoging heeft de volgende beperkingen:

    • Meer dan 253 vreemde-sleutelreferenties worden ondersteund voor DELETE- en UPDATE DML-bewerkingen. MERGE bewerkingen worden niet ondersteund.

    • Een tabel met een foreign key verwijzing naar zichzelf is nog steeds beperkt tot 253 foreign key verwijzingen.

    • Vreemde-sleutelverwijzingen die groter zijn dan 253, zijn momenteel niet beschikbaar voor columnstore-indexen of geheugen-geoptimaliseerde tabellen.

  • FOREIGN KEY beperkingen worden niet afgedwongen voor tijdelijke tabellen.

  • Als een vreemde sleutel is gedefinieerd op een CLR-kolom met een gebruikersgedefinieerd type, moet de implementatie van het type binaire volgorde ondersteunen. Zie CLR User-Defined Typenvoor meer informatie.

  • Een kolom van het type varchar(max) kan alleen deelnemen aan een FOREIGN KEY beperking als de primaire sleutel die wordt verwezen ook wordt gedefinieerd als type varchar(max).

Een buitenlandse sleutelrelatie maken in Table Designer

SQL Server Management Studio gebruiken

  1. Klik in Objectverkenner met de rechtermuisknop op de tabel die zich aan de kant van de buitenlandse sleutel van de relatie bevindt en selecteer Ontwerp.

    De tabel wordt geopend in Databasetabellen maken en bijwerken.

  2. In het menu Tabelontwerper, selecteer Relaties. (Zie het menu Tabelontwerper in de koptekst of klik met de rechtermuisknop in de lege ruimte van de tabeldefinitie en selecteer vervolgens Relaties....)

  3. In het dialoogvenster Relaties met vreemde sleutels, selecteer Toevoegen.

    De relatie wordt weergegeven in de geselecteerde relatie lijst met een door het systeem opgegeven naam in de indeling FK_<tablename>_<tablename>, waarbij de eerste tabelnaam de naam van de refererende-sleuteltabel is en de tweede tabelnaam de naam van de primaire-sleuteltabel is. Dit is slechts een standaardinstelling en algemene naamconventie voor het (naam) veld van het vreemde-sleutelobject.

  4. Selecteer de relatie in de geselecteerde relatie lijst.

  5. Selecteer tabel- en kolomspecificatie in het raster rechts en selecteer het beletselteken (...) rechts van de eigenschap.

  6. Kies in het dialoogvenster Tabellen en kolommen, in de vervolgkeuzelijst Primaire Sleutel, de tabel die zich aan de primaire-sleutelzijde van de relatie bevindt.

  7. Kies in het raster onder het dialoogvenster de kolommen die bijdragen aan de primaire sleutel van de tabel. Kies in de aangrenzende vak rechts van elke kolom de corresponderende foreign-key kolom van de foreign-key tabel.

    Tabelontwerper suggereert een naam voor de relatie. Als u deze naam wilt wijzigen, bewerkt u de inhoud van het tekstvak relatienaam.

  8. Kies OK om de relatie aan te maken.

  9. Sluit het venster Tabelontwerper en sla de wijzigingen op om de wijziging in de referentiesleutelrelatie van kracht te laten worden.

Een vreemde sleutel maken in een nieuwe tabel

Gebruik Transact-SQL

In het volgende voorbeeld wordt een tabel gemaakt en wordt een foreign key-constraint gedefinieerd voor de kolom TempID die verwijst naar de kolom SalesReasonID in tabel Sales.SalesReason in database AdventureWorks. De ON DELETE CASCADE- en ON UPDATE CASCADE-componenten worden gebruikt om ervoor te zorgen dat wijzigingen in Sales.SalesReason tabel automatisch worden doorgegeven aan de Sales.TempSalesReason tabel.

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

Een vreemde sleutel maken in een bestaande tabel

Gebruik Transact-SQL

In het volgende voorbeeld wordt een foreign key gemaakt op de kolom TempID en verwijst naar de kolom SalesReasonID in de Sales.SalesReason-tabel in de AdventureWorks-database.

ALTER TABLE Sales.TempSalesReason
ADD CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID)
REFERENCES Sales.SalesReason (SalesReasonID)
   ON DELETE CASCADE
   ON UPDATE CASCADE;