FOREIGN KEY og referentielle handlinger
Forbind tabeller med FOREIGN KEY, og vælg ON DELETE CASCADE / SET NULL / RESTRICT efter den ønskede adfærd.
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ækkeSET NULL— sæt den underordnede rækkes FK til NULLSET 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 hereTilfø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?
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
- NOT NULL- og CHECK-begrænsninger
- UNIQUE-begrænsninger og sammensatte nøgler
- FOREIGN KEY og referentielle handlinger
- DEFAULT-værdier og genererede kolonner