I SQL opretter du en relation ved at oprette en fremmednøglebegrænsning.
Mere specifikt har du et overordnet bord og et underordnet bord. Den overordnede indeholder den primære nøgle, og den underordnede tabel indeholder en fremmednøgle, der refererer til den primære nøgle til den overordnede tabel.
Når du bruger SQL til at oprette en relation, kan du oprette relationen på det tidspunkt, du opretter tabellen, eller du kan oprette den senere (ved at ændre tabellen). Denne artikel dækker begge scenarier.
Opret et forhold, når du opretter tabellen
Her er et eksempel på oprettelse af en relation i din CREATE TABLE
sætning på det tidspunkt, du opretter tabellen.
CREATE TABLE Parent (
ParentId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ParentName nvarchar(255) NOT NULL
)
CREATE TABLE Child (
ChildId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ChildName nvarchar(255) NOT NULL,
ParentId int NOT NULL
CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)
REFERENCES Parent (ParentId)
);
Her lavede jeg to tabeller; en kaldet Parent
og den anden kaldet Child
.
Jeg oprettede relationen inden for tabeldefinitionen for barn. Relationen oprettes med CONSTRAINT
argument. Bemærk, at dette stadig er inde i CREATE TABLE
erklæring.
Forholdet har brug for et navn. I dette tilfælde kaldte jeg det FK_Child_Parent
. FOREIGN KEY
del efterfølges af navnet på den kolonne (i den underordnede tabel), der vil være fremmednøglen.
REFERENCES
del angiver den kolonne, som fremmednøglen refererer til. I dette tilfælde refererer det til ParentId
kolonne i Parent
bord. Dette gøres ved hjælp af REFERENCES Parent (ParentId)
.
Det er alt, der kræves for at skabe forholdet.
Bemærk, at eksemplerne på denne side blev udført ved hjælp af SQL Server. Afhængigt af dit DBMS skal du muligvis ændre nogle detaljer i kolonnedefinitionerne.
For eksempel IDENTITY
er SQL Servers version af det, der nogle gange kaldes AUTO_INCREMENT
i andre DBMS'er (såsom MySQL). Hvis du bruger SQLite, kan du se her, hvordan du opretter en kolonne med automatisk stigning i SQLite.
Tilføj et forhold til en eksisterende tabel
Du kan også tilføje en relation til en eksisterende tabel, blot ved at bruge ALTER TABLE
erklæring.
Lad os foregive, at vi ikke oprettede relationen, da vi oprettede de to tabeller fra det forrige eksempel. Så lad os foregive, at vi havde gjort dette i stedet for:
CREATE TABLE Parent (
ParentId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ParentName nvarchar(255) NOT NULL
)
CREATE TABLE Child (
ChildId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ChildName nvarchar(255) NOT NULL,
ParentId int NOT NULL
);
Så i dette scenarie var alt, hvad vi gjorde, at oprette to tabeller. Der blev ikke skabt nogen relation mellem dem.
Nu, efter at have oprettet tabellerne, husker vi pludselig "oh dang, jeg glemte at skabe et forhold!".
Intet problem, vi kan nu gøre dette:
ALTER TABLE Child
ADD CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)
REFERENCES Parent (ParentId);
Færdig. Vi har lige tilføjet forholdet ved at bruge de samme detaljer som i det foregående eksempel.
Bemærk, at SQLite ikke understøtter tilføjelse af fremmednøgler med ALTER TABLE
udmelding. Se, hvordan du tilføjer en fremmednøgle til en eksisterende tabel i SQLite for mere om det.
Ved opdatering/slet
Som standard oprettes SQL Server-relationer ved hjælp af ON DELETE NO ACTION
og ON UPDATE NO ACTION
. Derfor blev de tidligere eksempler oprettet ved hjælp af denne indstilling.
Forskellige DBMS'er kan dog bruge andre standardindstillinger.
Uanset hvad, kan du udtrykkeligt angive dette i din kode. Så vi kan ændre det forrige eksempel til at se sådan ud:
ALTER TABLE Child
ADD CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)
REFERENCES Parent (ParentId)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Hvad dette faktisk betyder er, at hvis nogen skulle forsøge at slette eller opdatere en post i den primære nøgle, ville der opstå en fejl, og ændringen ville blive rullet tilbage. Dette er SQL Servers måde at forhindre ændringer, der kan bryde dit systems referenceintegritet.
Grunden til, at du opretter et forhold i første omgang, er grundlæggende for at håndhæve referentiel integritet.
Du har dog nogle muligheder for, hvordan du vil have SQL Server til at håndtere disse situationer.
Specifikt kan du bruge en af følgende værdier:
NO ACTION
:Der vises en fejl, og sletnings-/opdateringshandlingen på rækken i den overordnede tabel rulles tilbage.CASCADE
:Tilsvarende rækker slettes fra/opdateres i referencetabellen, hvis den pågældende række slettes fra/opdateres i den overordnede tabel.SET NULL
:Alle de værdier, der udgør fremmednøglen, er sat tilNULL
hvis den tilsvarende række i den overordnede tabel slettes eller opdateres. Dette kræver, at de fremmede nøglekolonner er nullbare.SET DEFAULT
:Alle værdier, der udgør fremmednøglen, indstilles til deres standardværdier, hvis den tilsvarende række i den overordnede tabel slettes eller opdateres. For at denne begrænsning kan udføres, skal alle fremmednøglekolonner have standarddefinitioner. Hvis en kolonne er nullbar, og der ikke er angivet nogen eksplicit standardværdi,NULL
bliver den implicitte standardværdi for kolonnen.