Lær, hvordan du opretter en relation mellem to tabeller i SQL Server.
I relationelt databasedesign, et relation er, hvor to eller flere tabeller er knyttet sammen, fordi de indeholder relaterede data. Dette gør det muligt for brugere at køre forespørgsler efter relaterede data på tværs af flere tabeller.
Denne del af selvstudiet forklarer, hvordan du opretter følgende relationer:
Der er to forhold i det diagram. Der er et forhold mellem Albums
og Artists
tabeller, og der er et andet forhold mellem Albums
og Genres
tabeller.
Ved at se på det diagram kan vi se, at en kunstner kunne have mange albums. I dette tilfælde skal vi kun have én række, der indeholder kunstnerens navn, uanset hvor mange albums de har. Dette skyldes, at vi kan oprette en post i Artists
tabel med et unikt ArtistId
. Alle album for den kunstner vil ligge i Albums
tabel, og de vil indeholde det samme kunstner-id i sin egen ArtistId
kolonne. Ved at gøre dette kan vi køre en forespørgsel på tværs af begge tabeller og returnere kunstnerens navn plus alle de album, de har udgivet. Dette er fordelen ved relationer.
Tidligere har vi oprettet en database med de tre ovenstående tabeller. Da vi gjorde det, skabte vi også en af relationerne afbildet i ovenstående diagram. Vi skabte forholdet mellem Albums
tabellen og Artists
tabel (hvor ArtistId
kolonne i Albums
tabel refererer til ArtistsId
kolonne i Artists
tabel).
Her er koden, vi kørte for at oprette tabellerne:
Den fremhævede kode er den del, der skaber en relation mellem Albums
tabellen og Artists
bord. Det gør det ved at indstille ArtistId
kolonne i Albums
for at referere til ArtistId
kolonne i Artists
tabel.
En mere teknisk måde at sige dette på er Albums.ArtistId
bliver en fremmednøgle til Artists.ArtistId
(som i sig selv er den primære nøgle i den tabel). Dette er en fremmednøglebegrænsning.
Hvad er en fremmednøglebegrænsning?
En fremmednøglebegrænsning definerer en relation mellem denne tabel og en anden tabel. Når du opretter en fremmednøglebegrænsning, opretter du den mod en specifik kolonne i underordnet tabel, for at referere til en specifik kolonne i overordnet tabel.
Dette gør den kolonne i den underordnede tabel til en fremmednøgle . Begrænsningen sikrer, at enhver værdi, der går ind i denne (fremmednøgle) kolonne, svarer til en værdi i den primære nøglekolonne i den overordnede tabel. Hvis nogen forsøger at indtaste en værdi, der ikke svarer til en værdi i den overordnede tabels primære nøglekolonne, vil SQL Server give en fejl.
Dette hjælper med at håndhæve referentiel integritet. Det forhindrer os i at have forældreløse optegnelser (underordnede optegnelser, der ikke har nogen forælder). Eller i vores eksempel albums, der ikke er knyttet til nogen kunstner.
Hvis du bruger et GUI-databasestyringsværktøj som SSMS eller Azure Data Studio, vises relationen under Keys
node for tabellen med fremmednøglen:
Lad os dekonstruere koden:
CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId) REFERENCES dbo.Artists (ArtistId) ON DELETE NO ACTION ON UPDATE NO ACTION
De første to linjer skaber forholdet. De skaber en fremmednøgle-begrænsning mellem
Albums.ArtistId
kolonnen og
Artists.ArtistId
kolonne. I dette tilfælde kalder vi den fremmede nøgle-begrænsning FK_Albums_Artists
.
De sidste to linjer angiver, hvad SQL Server skal gøre, hvis nogen forsøger at slette eller opdatere en overordnet post, der refereres til af en post i den underordnede tabel. I dette tilfælde NO ACTION
betyder, at sletningen/opdateringen ikke fortsætter. Brugeren får bare en fejl.
Du kan ændre dette til ON DELETE CASCADE
hvis du vil være i stand til at slette forælderen og barnet på én gang (dvs. sletningen vil kaskade fra forælderen til barnet). Den samme logik gælder for opdateringer ved at bruge ON UPDATE CASADE
.
NO ACTION
er standardværdien, så vi kunne have undværet de sidste to linjer kode. Jeg inkluderede det dog, fordi det er en vigtig faktor at tænke på, når du opretter begrænsninger for fremmednøgle.
Tilføj et forhold til en eksisterende tabel
Det forrige eksempel opretter en relation samtidig med, at tabellerne oprettes. Der kan dog være tidspunkter, hvor du skal tilføje en relation til en eksisterende tabel.
Lad os tilføje et nyt forhold mellem Genres
og Albums
tabeller.
Kør følgende kode:
USE Music; ALTER TABLE Albums ADD CONSTRAINT FK_Albums_Genres FOREIGN KEY (GenreId) REFERENCES dbo.Genres (GenreId) ON DELETE NO ACTION ON UPDATE NO ACTION ;
Dette skaber en ny fremmednøgle på Albums
bord. Det resulterer i Albums.GenreId
bliver en fremmednøgle, der refererer til Genres.GenreId
.
Så kørsel af den sætning resulterer i, at en ny fremmednøgle vises under Nøgler node:
Enkeltkolonne udenlandske nøgler
Enkeltkolonne fremmednøgler (som den ovenfor) kan også specificeres på kolonneniveau. Så en anden måde at skabe Albums
på tabel og dens fremmednøgle er sådan her:
CREATE TABLE Albums ( AlbumId int IDENTITY(1,1) NOT NULL PRIMARY KEY, AlbumName nvarchar(255) NOT NULL, ReleaseDate date NOT NULL, ArtistId int NOT NULL REFERENCES Artists(ArtistId), GenreId int NOT NULL );
Denne metode kan ikke bruges på nøglebegrænsninger med flere kolonner, så for dem skal du bruge syntaksen i det originale eksempel ovenfor.
Udenlandske nøgler med flere kolonner
En fremmednøgle med flere kolonner er, hvor mere end én kolonne bruges til fremmednøglen. Dette bruges typisk, når den overordnede tabel bruger flere kolonner til sin primære nøgle. Dette kan være tilfældet, hvis den overordnede tabel kombinerer værdierne fra to kolonner for at skabe en unik værdi.
Fremmednøgler med flere kolonner kan oprettes ved hjælp af syntaksen i det originale eksempel ovenfor. Du skal blot tilføje hvert kolonnenavn adskilt af et komma.
Så hvis vi forestiller os, at Albums
tabel har også et ArtistName
kolonne (og at Artists
tabel bruger ArtistId
og ArtistName
som dens primære nøgle), vil en fremmednøgle med flere kolonner se sådan ud:
CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId, ArtistName) REFERENCES dbo.Artists (ArtistId, ArtistName)