SQL Server FOREIGN KEY: Hoe maak je er een aan met een voorbeeld?

โšก Slimme samenvatting

Een foreign key in SQL Server zorgt voor referentiรซle integriteit door een onderliggende tabel te koppelen aan een bovenliggende tabel. Elke foreign key-waarde moet al bestaan โ€‹โ€‹in de primaire sleutel van de bovenliggende tabel waarnaar wordt verwezen.

  • ๐Ÿ”— Wat is een externe sleutel? Een externe sleutel koppelt een onderliggende tabel aan een bovenliggende tabel en zorgt voor referentiรซle integriteit tussen beide.
  • ๐Ÿ‘ช Ouder en kind: De tabel waarnaar wordt verwezen, is de oudertabel; de tabel met de externe sleutel is de kindtabel, die verwijst naar de primaire sleutel van de oudertabel.
  • ๏ธ Twee aanmaakmethoden: Zowel de relaties in SQL Server Management Studio als de T-SQL-clausule CREATE TABLE โ€ฆ FOREIGN KEY โ€ฆ REFERENCES definiรซren een externe sleutel.
  • โž• Toevoegen aan een bestaande tabel: ALTER TABLE โ€ฆ ADD CONSTRAINT โ€ฆ FOREIGN KEY voegt de relatie toe aan een tabel die al bestaat.
  • ๐Ÿ”„ Referentiรซle acties: De clausules ON DELETE en ON UPDATE beheren onderliggende rijen met NO ACTION, CASCADE, SET NULL of SET DEFAULT.
  • โœ… Integrity controleren: Het invoegen van een onderliggende rij waarvan de sleutel geen overeenkomende bovenliggende rij heeft, wordt geweigerd.ping De gegevens zijn consistent.

Een FOREIGN KEY in SQL Server maken: hoe u deze aanmaakt met een voorbeeld.

Wat is een BUITENLANDSE SLEUTEL?

Een externe sleutel biedt een manier om referentiรซle integriteit af te dwingen. SQL ServerSimpel gezegd zorgt een foreign key ervoor dat waarden in de ene tabel ook in een andere tabel aanwezig moeten zijn.

Regels voor BUITENLANDSE SLEUTEL

  • NULL is toegestaan โ€‹โ€‹in een SQL-foreign key.
  • De tabel waarnaar wordt verwezen, wordt de oudertabel genoemd.
  • De tabel met de externe sleutel wordt de kindtabel genoemd.
  • De externe sleutel in de kindtabel verwijst naar de hoofdsleutel in de oudertabel.
  • Deze ouder-kindrelatie handhaaft de regel die bekend staat als "referentiรซle integriteit".

Het onderstaande diagram vat alle bovenstaande punten samen met betrekking tot de externe sleutel.

Diagram van een externe sleutel die een kindtabel koppelt aan de primaire sleutel van de oudertabel.

Hoe u een FOREIGN KEY in SQL kunt maken

Je kunt in SQL Server op twee manieren een externe sleutel aanmaken:

SQL Server Management Studio

Oudertabel: Stel, we hebben een bestaande oudertabel met de naam 'Course'. Course_ID en Course_name zijn twee kolommen, waarbij Course_ID de primaire sleutel is.

Hoofdtabel Course met de primaire sleutel Course_Id en de kolommen Course_name

Kindtabel: We moeten een tweede tabel aanmaken als kindtabel. De twee kolommen hiervan zijn 'Course_ID' en 'Course_Strength'. 'Course_ID' moet echter de externe sleutel zijn.

Stap 1) Klik met de rechtermuisknop op Tabellen > Nieuw > Tabelโ€ฆ

Klik met de rechtermuisknop op Tabellen, vervolgens op Nieuw en daarna op Tabel in SQL Server Management Studio.

Stap 2) Voer twee kolomnamen in: 'Course_ID' en 'Course_Strength'. Klik met de rechtermuisknop op de kolom 'Course_ID' en klik vervolgens op 'Relatie'.

Nieuwe subtabelkolommen Course_ID en Course_Strength met het menu Relaties

Stap 3) Klik in 'Verschillende sleutelrelaties' op 'Toevoegen'.

Dialoogvenster 'Verschillende sleutelrelaties' met de knop 'Toevoegen'

Stap 4) Klik in 'Tabellen en kolomspecificaties' op het '...'-pictogram.

Specificatieveld voor tabellen en kolommen met de drie puntjesknop

Stap 5) Selecteer 'COURSE' als 'Primaire sleuteltabel' en de nieuw aan te maken tabel als 'Tabel met externe sleutels' in het keuzemenu.

COURSE selecteren als de primaire sleuteltabel in het relatiedialoogvenster

Stap 6) Selecteer voor de 'Primaire sleuteltabel' de kolom 'Course_Id' als de kolom voor de primaire sleuteltabel.

Selecteer bij 'Tabel met externe sleutel' de kolom 'Course_Id' als de kolom voor de tabel met externe sleutel. Klik op OK.

Wereldmapping Course_Id als zowel primaire sleutel als externe sleutelkolom

Stap 7) Klik op Toevoegen.

Klik op 'Toevoegen' om de relatie tussen de externe sleutels te bevestigen.

Stap 8) Geef de tabel de naam 'Course_Strength' en klik op OK.

De kindtabel de naam Course_Strength geven en op OK klikken.

Resultaat: We hebben een ouder-kindrelatie ingesteld tussen 'Cursus' en 'Cursussterkte'.

Ouder-kindrelatie tot stand gebracht tussen Course en Course_Strength

T-SQL: Een ouder-kindtabel maken met T-SQL

Oudertabel: We hebben al een oudertabel met de naam 'Course'. Course_ID en Course_name zijn twee kolommen, waarbij Course_ID de primaire sleutel is.

Bestaande oudertabel Course met Course_Id als primaire sleutel

Kindtabel: We moeten een tweede tabel aanmaken als kindtabel met de naam 'Course_Strength_TSQL'. De twee kolommen zijn 'Course_ID' en 'Course_Strength'. 'Course_ID' moet echter de externe sleutel zijn.

Hieronder staat de syntaxis voor maak een tabel met een FOREIGN KEY.

Syntax:

CREATE TABLE childTable
(
  column_1 datatype [ NULL |NOT NULL ],
  column_2 datatype [ NULL |NOT NULL ],
  ...

  CONSTRAINT fkey_name
    FOREIGN KEY (child_column1, child_column2, ... child_column_n)
    REFERENCES parentTable (parent_column1, parent_column2, ... parent_column_n)
    [ ON DELETE { NO ACTION |CASCADE |SET NULL |SET DEFAULT } ]
    [ ON UPDATE { NO ACTION |CASCADE |SET NULL |SET DEFAULT } ] 
);

Hier volgt een beschrijving van de bovenstaande parameters:

  • childTable is de naam van de tabel die moet worden gemaakt.
  • column_1 en column_2 zijn de kolommen die aan de tabel moeten worden toegevoegd.
  • fkey_name is de naam van de aan te maken foreign key-beperking.
  • child_column1, child_column2 โ€ฆ child_column_n zijn de kolommen van de kindtabel die verwijzen naar de primaire sleutel in de parentTable.
  • parentTable is de naam van de bovenliggende tabel waarvan de sleutel in de onderliggende tabel wordt gebruikt.
  • parent_column1, parent_column2 โ€ฆ parent_column_n zijn de kolommen die de primaire sleutel van de oudertabel vormen.
  • ON DELETE is een optionele parameter die aangeeft wat er met de onderliggende gegevens gebeurt nadat de bovenliggende gegevens zijn verwijderd. Mogelijke waarden zijn NO ACTION, SET NULL, CASCADE of SET DEFAULT.
  • ON UPDATE is een optionele parameter die aangeeft wat er met de onderliggende gegevens gebeurt nadat de bovenliggende gegevens zijn bijgewerkt. Mogelijke waarden zijn NO ACTION, SET NULL, CASCADE of SET DEFAULT.
  • 'GEEN ACTIE' betekent dat er niets gebeurt met de onderliggende gegevens nadat de bovenliggende gegevens zijn bijgewerkt of verwijderd.
  • CASCADE betekent dat de onderliggende gegevens worden verwijderd of bijgewerkt nadat de bovenliggende gegevens zijn verwijderd of bijgewerkt.
  • SET NULL betekent dat de onderliggende gegevens op null worden gezet nadat de bovenliggende gegevens zijn bijgewerkt of verwijderd.
  • SET DEFAULT betekent dat de onderliggende gegevens na een update of verwijdering van de bovenliggende gegevens worden teruggezet naar hun standaardwaarde.

Laten we een voorbeeld bekijken van een foreign key waarmee een tabel wordt gemaakt met รฉรฉn kolom als FOREIGN KEY. data type voor elke kolom.

Voorbeeld van een externe sleutel in SQL

Query:

CREATE TABLE Course_Strength_TSQL
(
Course_ID Int,
Course_Strength Varchar(20) 
CONSTRAINT FK FOREIGN KEY (Course_ID)
REFERENCES COURSE (Course_ID)	
)

Stap 1) Voer de query uit door op Uitvoeren te klikken.

De CREATE TABLE-query uitvoeren die de externe sleutel Course_ID definieert.

Resultaat: We hebben een ouder-kindrelatie ingesteld tussen 'Course' en 'Course_Strength_TSQL'.

Er is een ouder-kindrelatie gecreรซerd tussen Course en Course_Strength_TSQL.

ALTER TABEL gebruiken

Nu gaan we leren hoe je in SQL Server een foreign key toevoegt aan een bestaande tabel met behulp van de ALTER TABLE-instructie. We gebruiken de onderstaande syntaxis:

ALTER TABLE childTable
ADD CONSTRAINT fkey_name
    FOREIGN KEY (child_column1, child_column2, ... child_column_n)
    REFERENCES parentTable (parent_column1, parent_column2, ... parent_column_n);

Hier volgt een beschrijving van de hierboven gebruikte parameters:

  • childTable is de naam van de tabel die moet worden gemaakt.
  • column_1 en column_2 zijn de kolommen die aan de tabel moeten worden toegevoegd.
  • fkey_name is de naam van de aan te maken foreign key-beperking.
  • child_column1, child_column2 โ€ฆ child_column_n zijn de kolommen van de kindtabel die verwijzen naar de primaire sleutel in de parentTable.
  • parentTable is de naam van de bovenliggende tabel waarvan de sleutel in de onderliggende tabel wordt gebruikt.
  • parent_column1, parent_column2 โ€ฆ parent_column_n zijn de kolommen die de primaire sleutel van de oudertabel vormen.

ALTER TABLE: voorbeeld van het toevoegen van een foreign key:

ALTER TABLE department
ADD CONSTRAINT fkey_student_admission
    FOREIGN KEY (admission)
    REFERENCES students (admission);

We hebben een externe sleutel met de naam fkey_student_admission gemaakt in de afdelingstabel. Deze externe sleutel verwijst naar de toelatingskolom van de studententabel.

Voorbeeldquery FOREIGN KEY

Laten we eerst eens kijken naar de gegevens in onze hoofdtabel, COURSE.

Query:

SELECT * from COURSE;

SELECT-resultaat met de gegevens van de oudertabel COURSE

Laten we nu enkele rijen invoegen in de onderliggende tabel 'Course_Strength_TSQL'. We zullen proberen twee soorten rijen in te voegen:

  • Het eerste type is het geval wanneer Course_Id in de kindtabel voorkomt in Course_Id van de oudertabel, oftewel Course_Id = 1 en 2.
  • Het tweede type is er een waarbij de Course_Id in de kindtabel niet voorkomt in de Course_Id van de oudertabel, oftewel Course_Id = 5.

Query:

Insert into COURSE_STRENGTH values (1,'SQL');
Insert into COURSE_STRENGTH values (2,'Python');
Insert into COURSE_STRENGTH values (5,'PERL');

Kindrijen invoegen, inclusief Course_ID 5 die geen overeenkomende ouder heeft.

Resultaat: Laten we de query samen uitvoeren om onze ouder- en kindtabellen te bekijken.

De rijen met Course_ID 1 en 2 bestaan โ€‹โ€‹in de tabel Course_Strength. Course_ID 5 is echter een uitzondering, omdat er geen overeenkomende rij in de bovenliggende tabel is.

Ouder- en kindtabellen vergeleken; Course_ID 5 schendt referentiรซle integriteit

Veelgestelde vragen

Een primaire sleutel identificeert elke rij binnen de betreffende tabel uniek en mag niet NULL zijn. Een externe sleutel verwijst naar die primaire sleutel uit een andere tabel om referentiรซle integriteit te waarborgen. primaire sleutel versus externe sleutel Vergelijking verklaart elk verschil.

Ja. Een externe sleutel kan verwijzen naar een primaire sleutel of naar elke kolom met een UNIQUE-beperking in de bovenliggende tabel. De kolom waarnaar wordt verwezen, moet unieke waarden bevatten, zodat elke rij in de onderliggende tabel exact overeenkomt met รฉรฉn rij in de bovenliggende tabel.

ON DELETE CASCADE verwijdert automatisch de overeenkomende onderliggende rijen wanneer de bovenliggende rij wordt verwijderd.ping De tabellen moeten consistent zijn. Alternatieven zijn SET NULL, waarmee de onderliggende foreign key wordt gewist, en NO ACTION, waarmee de verwijdering wordt geblokkeerd.

Ja. Een zelfverwijzende foreign key verwijst naar een primary key in dezelfde tabel, wat hiรซrarchieรซn modelleert zoals een rij met een werknemer die verwijst naar zijn manager. Voor zelfverwijzingen raadt SQL Server aan om ON DELETE NO ACTION te gebruiken om cascadecycli te voorkomen.

Ja, tenzij de kolom is gedeclareerd als NOT NULL. Een NULL-waarde voor een externe sleutel betekent dat de onderliggende rij nog niet is gekoppeld aan een bovenliggende rij, en SQL Server slaat de referentiรซle controle voor die NULL-waarde over.

Voer ALTER TABLE child_table DROP CONSTRAINT fkey_name uit. U moet de naam van de constraint opgeven, die u kunt vinden in sys.foreign_keys. Verwijderping De foreign key verbreekt de relatie, maar laat beide tabellen en hun gegevens ongewijzigd.

Ja. GitHub-copiloot Je kunt FOREIGN KEY-beperkingen schrijven binnen CREATE TABLE- of ALTER TABLE-instructies vanuit een natuurlijke taalprompt en suggesties krijgen voor de bovenliggende tabel en de kolom waarnaar wordt verwezen. Controleer altijd de sleutels, referentiรซle acties en gegevenstypen voordat je het script uitvoert.

AI- en machine learning-tools analyseren voorbeeldgegevens en querypatronen om te suggereren welke kolommen als externe sleutels moeten worden gebruikt, ontbrekende of weesrelaties te detecteren en geschikte acties bij verwijdering aan te bevelen. De ontwikkelaar beoordeelt elke suggestie voordat deze wordt toegepast.

Vat dit bericht samen met: