</>
Plan du cours — 16/64

Clés étrangères et ON DELETE

Intermédiaire

Une clé étrangère garantit qu'une référence pointe vers une ligne qui existe : c'est l'intégrité référentielle, assurée par la base et non par le code applicatif.

CREATE TABLE commandes (
    id         bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    client_id  bigint NOT NULL REFERENCES clients (id) ON DELETE RESTRICT,
    total      numeric(12, 2) NOT NULL
);

CREATE INDEX commandes_client_id_idx ON commandes (client_id);   -- à faire vous-même !

Que faire à la suppression du parent ?#

OptionComportement
NO ACTION (défaut) / RESTRICTRefuse de supprimer le parent tant que des enfants existent
CASCADESupprime aussi les enfants
SET NULLMet la clé étrangère à NULL (la colonne doit l'accepter)
SET DEFAULTRemet la valeur par défaut

Piège : PostgreSQL ne crée pas automatiquement d'index sur la colonne référençante d'une clé étrangère. Sans index sur commandes.client_id, chaque suppression d'un client et chaque jointure parcourt toute la table commandes. Créez systématiquement cet index.

Astuce : réservez CASCADE aux vrais liens de composition (les lignes d'une commande n'ont pas de sens sans elle). Pour les entités métier, préférez RESTRICT et une suppression logique.