Clés étrangères et ON DELETE
IntermédiaireUne 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 ?#
| Option | Comportement |
|---|---|
NO ACTION (défaut) / RESTRICT | Refuse de supprimer le parent tant que des enfants existent |
CASCADE | Supprime aussi les enfants |
SET NULL | Met la clé étrangère à NULL (la colonne doit l'accepter) |
SET DEFAULT | Remet 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 tablecommandes. Créez systématiquement cet index.
Astuce : réservez
CASCADEaux vrais liens de composition (les lignes d'une commande n'ont pas de sens sans elle). Pour les entités métier, préférezRESTRICTet une suppression logique.