SQL
Primærnøgler og fremmednøgler
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
idfrem 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
- Datamodellering Datamodellering forklaret på dansk: fra beskrivelse til tabeller, entiteter og relationer, og hvordan en mange-til-mange-relation løses med en tredje tabel.
- JOIN forklaret SQL JOIN forklaret på dansk: inner join, left join og forskellen på dem. Hvorfor du pludselig får flere rækker, end du forventede, og hvordan du undgår det.
- Normalisering Normalisering forklaret på dansk med et gennemgående eksempel gennem første, anden og tredje normalform, og hvornår man bevidst afviger fra det.
Senest gennemgået .