SQL Academy · Lektion

FOREIGN KEY og referentielle handlinger

Forbind tabeller med FOREIGN KEY, og vælg ON DELETE CASCADE / SET NULL / RESTRICT efter den ønskede adfærd.

Lektion 3 af 413 trin

FOREIGN KEY og referentielle handlinger er en gratis SQL Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i SQL Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. SQL Academy-kurset indeholder 4 lektioner i alt.

Hvad en fremmednøgle gør

En FOREIGN KEY får databasen til at afvise rækker, der peger på ikke-eksisterende overordnede rækker:

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 bruge fremmednøgler?

FK'er håndhæver referentiel integritet:

  • Ingen herreløse rækker
  • Opdager fejl i applikationen ved indsættelse
  • Gør ER-diagrammer korrekte
  • Muliggør automatisk kaskadeadfærd

Referentielle handlinger

Hvad skal der ske, når den overordnede række slettes eller opdateres? Der er fem muligheder:

  • NO ACTION — fejl (standard, kan udskydes)
  • RESTRICT — fejl (kan ikke udskydes)
  • CASCADE — slet eller opdatér også den underordnede række
  • SET NULL — sæt den underordnede rækkes FK til NULL
  • SET DEFAULT — sæt den underordnede rækkes FK til dens standardværdi

ON DELETE CASCADE

"Når brugeren slettes, skal brugerens ordrer også 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, beholder medarbejderne deres eksisterende poster, men mister deres leder":

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

Uden en referentiel handling mislykkes et forsøg på at slette en overordnet række, der har underordnede rækker:

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".

Indeksér altid FK-kolonnen

PostgreSQL opretter IKKE automatisk et indeks på den underordnede side. Tilføj et — uden det udløser sletning af en overordnet række en fuld scanning af alle underordnede tabeller:

CREATE INDEX orders_user_id_idx ON orders(user_id);

Sammensatte fremmednøgler

Referér til en sammensat primærnøgle:

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)
);

Udskydelse af kontroller af fremmednøgler

Nogle gange skal du indsætte et hønen-og-ægget-par. Markér FK'en 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 here

Tilføjelse af fremmednøgler online

Brug NOT VALID + VALIDATE på store tabeller for at undgå en langvarig lås:

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;

Brug kaskader med omtanke

CASCADE-sletninger forplanter sig. Sletning af en bruger kan fjerne ordrer, betalinger og revisionslogge. Sørg for, at kaskaden svarer til din forretningsmæssige hensigt.

Opsummering

Fremmednøgler fungerer som sikkerhedsnet.

  • REFERENCES + handling erklærer forbindelsen og adfærden
  • Indeksér FK-kolonnen på den underordnede side
  • Brug NOT VALID + VALIDATE til tilføjelser online

Hurtigt tjek

Hvilken referentiel handling fjerner AUTOMATISK en ordre, når dens overordnede bruger slettes?

Gratis at komme i gang

Lær SQL med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
46
Lektioner
183

Ofte stillede spørgsmål

Er lektionen “FOREIGN KEY og referentielle handlinger” gratis?

Ja — hele teksten til “FOREIGN KEY og referentielle handlinger” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af SQL Academy-kurset, skal du opgradere til CoddyKit PRO. SQL Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “FOREIGN KEY og referentielle handlinger”?

Forbind tabeller med FOREIGN KEY, og vælg ON DELETE CASCADE / SET NULL / RESTRICT efter den ønskede adfærd. Du øver dig i SQL Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på SQL Academy?

Der kræves ingen tidligere erfaring. SQL Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “FOREIGN KEY og referentielle handlinger”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne SQL Academy-lektion?

Ja. Alle SQL Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. NOT NULL- og CHECK-begrænsninger
  2. UNIQUE-begrænsninger og sammensatte nøgler
  3. FOREIGN KEY og referentielle handlinger
  4. DEFAULT-værdier og genererede kolonner
← Tilbage til SQL Academy