Spring til indhold
Academi.dk

SQL

Primærnøgler og fremmednøgler

Let øvet DA↔EN-ordliste

En primærnøgle udpeger entydigt én række i en tabel. En fremmednøgle er en kolonne, der peger på en primærnøgle i en anden tabel, og det er sådan tabeller hænger sammen. Databasen kan selv sikre, at en fremmednøgle altid peger på noget, der findes.

Forudsætter, at du har set datamodellering .

Primærnøglen: hvem er den her række?

Uden en primærnøgle kan du ikke pege på en bestemt række. To kunder kan hedde det samme og bo på samme adresse, men de skal kunne holdes fra hinanden.

CREATE TABLE kunde (
  id    INT PRIMARY KEY,
  navn  VARCHAR(100) NOT NULL,
  email VARCHAR(255) NOT NULL UNIQUE
);

En primærnøgle er automatisk unik og må ikke være tom. De fleste databaser kan tælle den op for dig, så du ikke selv skal finde det næste nummer.

Skal e-mailen så ikke bare være nøglen? Nej. Den slags kaldes en naturlig nøgle, og problemet er, at den kan ændre sig. Skifter kunden e-mail, skal værdien rettes alle de steder, der peger på den. Brug et id, der ikke betyder noget, og sæt UNIQUE på e-mailen i stedet, så har du begge dele.

Fremmednøglen: hvem hører jeg til?

CREATE TABLE ordre (
  id       INT PRIMARY KEY,
  kunde_id INT NOT NULL,
  dato     DATE NOT NULL,
  FOREIGN KEY (kunde_id) REFERENCES kunde(id)
);

kunde_id peger på en id i kunde. Nu ved databasen, hvordan de to tabeller hænger sammen, og det er den viden, en JOIN bruger.

Referentiel integritet

Med fremmednøglen på plads siger databasen selv nej til det umulige:

  • Du kan ikke indsætte en ordre med et kunde_id, der ikke findes.
  • Du kan ikke slette en kunde, der har ordrer, medmindre du har sagt, hvad der så skal ske.

Det er hele pointen. Reglen ligger ét sted i stedet for at skulle huskes i hver eneste linje kode, der rører ved data.

Ved sletning bestemmer du selv:

  • ON DELETE RESTRICT. Afvis sletningen. Standard, og som regel det rigtige.
  • ON DELETE CASCADE. Slet også de rækker, der pegede. Rigtigt for ordrelinjer, der hører til en ordre. Farligt for alt andet.
  • ON DELETE SET NULL. Behold rækken, men glem hvem den hørte til.

Sammensatte nøgler

I en mange-til-mange-tabel er nøglen ofte de to fremmednøgler tilsammen:

CREATE TABLE ordrelinje (
  ordre_id   INT NOT NULL,
  produkt_id INT NOT NULL,
  antal      INT NOT NULL,
  PRIMARY KEY (ordre_id, produkt_id),
  FOREIGN KEY (ordre_id)   REFERENCES ordre(id),
  FOREIGN KEY (produkt_id) REFERENCES produkt(id)
);

Kombinationen skal være unik: det samme produkt må kun stå én gang på den samme ordre. Skal det kunne stå flere gange, giver du i stedet tabellen sin egen id.

Kort opsamling

  • Primærnøgle: unik, aldrig tom, én pr. tabel.
  • Brug et betydningsløst id frem for e-mail eller navn.
  • Fremmednøgle peger på en primærnøgle i en anden tabel.
  • Databasen håndhæver selv, at pilen peger på noget, der findes.

Læs videre

Senest gennemgået .