Tous les termes du glossaire

Clé étrangère

Qu’est-ce qu’une clé étrangère dans PostgreSQL ?

Une clé étrangère exige que les valeurs d’une table correspondent à une ligne d’une autre table : vous ne pouvez donc pas pointer vers une ligne qui n’existe pas. ON DELETE détermine ce qui se passe lors de la suppression de cette ligne.

Une contrainte de clé étrangère spécifie que les valeurs d’une colonne (ou d’un groupe de colonnes) doivent correspondre aux valeurs d’une ligne d’une autre table. Elle maintient la cohérence entre tables liées : une insertion ou une mise à jour qui pointe vers une ligne inexistante est rejetée.

Les colonnes référencées doivent constituer une clé primaire ou faire l’objet d’une contrainte d’unicité. Lorsqu’une ligne référencée disparaît, l’action ON DELETE détermine la suite : NO ACTION (par défaut) et RESTRICT rejettent la suppression, CASCADE retire aussi les lignes qui la référencent, et SET NULL ou SET DEFAULT les modifient. PostgreSQL n’indexe pas automatiquement les colonnes référençantes, et y ajouter un index est souvent utile.

Exemple

L’exemple lie les factures aux clients avec ON DELETE CASCADE. La suppression du client entraîne aussi celle de sa facture : le décompte final est donc 0.

CREATE TABLE customers (id int PRIMARY KEY, name text NOT NULL);
CREATE TABLE invoices (
  id int PRIMARY KEY,
  customer_id int NOT NULL REFERENCES customers (id) ON DELETE CASCADE,
  amount numeric NOT NULL
);
INSERT INTO customers VALUES (1, 'Acme');
INSERT INTO invoices VALUES (10, 1, 99.50);

DELETE FROM customers WHERE id = 1;
SELECT count(*) FROM invoices;

Du SQL simple pour PostgreSQL 16 ou 17 standard, sans aucune extension. Exécutez-le dans une base de données vide que vous pouvez jeter ensuite.

Références

Documentation officielle de PostgreSQL (en anglais).

Termes associés