Drop links or images here to add them to the editor.

Database schema

Een foreign key maak je aan bij het aanmaken van een tabel met CREATE TABLE, via FOREIGN KEY ... REFERENCES ...:

CREATE TABLE tabelnaam (
  kolomnaam datatype,
  FOREIGN KEY (kolomnaam) REFERENCES andereTabel(primary_key_kolom)
);

De verwijzing moet altijd naar de primary key van de andere tabel wijzen.

Voorbeeld: maak tabel besteldePizza aan met een foreign key naar tabel bestelling:

CREATE TABLE besteldePizza (
  besteldePizzaID INTEGER PRIMARY KEY AUTOINCREMENT,
  pizzacode INTEGER,
  bestelcode INTEGER,
  bodemcode INTEGER,
  formaatcode INTEGER,
  FOREIGN KEY (bestelcode) REFERENCES bestelling(bestelcode)
);

Let op: in SQLite kun je geen foreign key toevoegen aan een al bestaande kolom. Plan de structuur dus van tevoren, of voeg een nieuwe kolom toe met een REFERENCES-clausule via ALTER TABLE ADD.


Verwerkingsopdracht: Foreign keys bij Danilo’s Pizzeria

Overzicht tabellen

a. Leg uit wat deze code betekent:

FOREIGN KEY (formaatcode) REFERENCES formaat(formaatcode)

b. Wat gaat er mis bij deze regel?

FOREIGN KEY (bodemcode) REFERENCES bodem(omschrijving)
Antwoord

a. De kolom formaatcode in de huidige tabel is een foreign key die verwijst naar de kolom formaatcode in tabel formaat. Elke waarde in formaatcode moet dus bestaan als primary key in tabel formaat.

b. De kolom omschrijving is geen primary key in tabel bodem — de primary key is bodemcode. Een foreign key moet altijd verwijzen naar de primary key van de andere tabel.


Je kunt hier een filmpje bekijken waarin wordt uitgelegd wat primary en foreign keys zijn.

Verwerkingsopdracht: Debuggen van een foutieve foreign key

Jonas schrijft deze code voor een tabel kortingsbon:

Koppeling tussen tabellen bestelling en kortingsbon

CREATE TABLE kortingsbon (
    boncode INTEGER PRIMARY KEY AUTOINCREMENT,
    korting REAL,
    datum TEXT,
    FOREIGN KEY (boncode) REFERENCES bestelling(boncode)
);

De code geeft geen foutmelding, maar de koppeling werkt niet. Wat doet Jonas verkeerd?

Antwoord

Jonas laat de foreign key in kortingsbon verwijzen naar boncode in tabel bestelling, maar boncode is geen primary key in bestelling. De foreign key in bestelling moet juist verwijzen naar de primary key (boncode) in kortingsbon — niet andersom. De koppeling moet in de andere richting worden gelegd.