FOREIGN KEY og referansehandlinger
Knytt tabeller sammen med FOREIGN KEY, og velg ON DELETE CASCADE / SET NULL / RESTRICT for riktig virkemåte.
FOREIGN KEY og referansehandlinger er en gratis leksjon i SQL Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i SQL Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i SQL Academy inneholder totalt 4 leksjoner.
Hva en fremmednøkkel gjør
En FOREIGN KEY får databasen til å avvise rader som peker på foreldre som ikke finnes:
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES users(id),
total NUMERIC(10,2) NOT NULL
);
-- Inserting an order with user_id=999 fails if no such user exists.Hvorfor bruke fremmednøkler?
Fremmednøkler håndhever referanseintegritet:
- Ingen foreldreløse rader
- Oppdager feil i applikasjonen ved innsetting
- Gjør ER-diagrammer korrekte
- Muliggjør automatisk kaskadeatferd
Referansehandlinger
Hva skal skje når foreldraden slettes eller oppdateres? Fem alternativer:
NO ACTION– feil (standard, kan utsettes)RESTRICT– feil (kan ikke utsettes)CASCADE– slett eller oppdater også den underordnede radenSET NULL– sett den underordnede radens FK til NULLSET DEFAULT– sett den underordnede radens FK til standardverdien
ON DELETE CASCADE
"Når brukeren slettes, skal også ordrene slettes":
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL
REFERENCES users(id) ON DELETE CASCADE,
total NUMERIC(10,2) NOT NULL
);ON DELETE SET NULL
"Når lederen fjernes, skal de ansatte bli værende, men miste lederen sin":
CREATE TABLE employees (
id BIGSERIAL PRIMARY KEY,
full_name TEXT NOT NULL,
manager_id BIGINT REFERENCES employees(id) ON DELETE SET NULL
);Standard: Som RESTRICT
Uten en referansehandling mislykkes et forsøk på å slette en forelder som har underordnede rader:
ERROR: update or delete on table "users" violates foreign key constraint "orders_user_id_fkey" on table "orders"
DETAIL: Key (id)=(42) is still referenced from table "orders".Indekser alltid FK-kolonnen
PostgreSQL oppretter IKKE automatisk en indeks på den underordnede siden. Legg til en – uten den utløser sletting av en forelder en fullstendig skanning av alle underordnede tabeller:
CREATE INDEX orders_user_id_idx ON orders(user_id);Sammensatte fremmednøkler
Referer til en sammensatt primærnøkkel:
CREATE TABLE order_items (
order_id BIGINT,
line_no INT,
PRIMARY KEY (order_id, line_no)
);
CREATE TABLE shipments (
order_id BIGINT,
line_no INT,
FOREIGN KEY (order_id, line_no)
REFERENCES order_items(order_id, line_no)
);Utsettelse av fremmednøkkelkontroller
Noen ganger må du sette inn et høna-og-egget-par. Merk fremmednøkkelen som DEFERRABLE INITIALLY DEFERRED:
ALTER TABLE orders
ALTER CONSTRAINT orders_user_id_fkey DEFERRABLE INITIALLY DEFERRED;
BEGIN;
INSERT INTO orders ... ; -- FK temporarily not checked
INSERT INTO users ... ;
COMMIT; -- checked hereLegge til fremmednøkler online
På store tabeller bør du bruke NOT VALID + VALIDATE for å unngå en langvarig låsing:
ALTER TABLE orders
ADD CONSTRAINT orders_user_id_fkey
FOREIGN KEY (user_id) REFERENCES users(id) NOT VALID;
ALTER TABLE orders VALIDATE CONSTRAINT orders_user_id_fkey;Bruk CASCADE med omtanke
CASCADE-slettinger forplanter seg. Sletting av en bruker kan fjerne ordrer, betalinger og revisjonslogger. Sørg for at kaskaden samsvarer med hensikten i virksomheten.
Oppsummering
Fremmednøkler fungerer som autovern.
- REFERENCES + handling erklærer koblingen og atferden
- Indekser FK-kolonnen på den underordnede tabellen
- Bruk NOT VALID + VALIDATE når du legger til begrensninger uten nedetid
Hurtigsjekk
Hvilken referansehandling fjerner AUTOMATISK en ordre når den overordnede brukeren slettes?
Lær deg SQL med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 46
- Leksjoner
- 183
Ofte stilte spørsmål
Er leksjonen «FOREIGN KEY og referansehandlinger» gratis?
Ja – hele teksten i «FOREIGN KEY og referansehandlinger» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av SQL Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i SQL Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «FOREIGN KEY og referansehandlinger»?
Knytt tabeller sammen med FOREIGN KEY, og velg ON DELETE CASCADE / SET NULL / RESTRICT for riktig virkemåte. Du øver på SQL Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med SQL Academy?
Ingen tidligere erfaring er nødvendig. SQL Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.
Hvor lang tid tar leksjonen «FOREIGN KEY og referansehandlinger»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne SQL Academy-leksjonen?
Ja. Alle SQL Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- NOT NULL- og CHECK-betingelser
- UNIQUE-betingelser og sammensatte nøkler
- FOREIGN KEY og referansehandlinger
- DEFAULT-verdier og genererte kolonner