sql >> Database teknologi >  >> RDS >> Sqlserver

Opret et forhold i SQL Server 2017

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)

  1. SYSUTCDATETIME() Eksempler i SQL Server (T-SQL)

  2. Algoritme til at undgå SQL-injektion på MSSQL Server fra C#-kode?

  3. Hvordan indsætter man JSONB i Postgresql med Python?

  4. Revision af PostgreSQL ved hjælp af pgAudit