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

Opret et forhold i SQL

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 til NULL 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.

  1. Aktivering af TLS i R12.1

  2. SqlConnection.Close() inde ved hjælp af sætning

  3. Spotlight Cloud-understøttelse af Azure SQL DB-meddelelse (Preview)

  4. Relationelt databasestyringssystem (RDBMS):MSSQL vs MySQL