Quand on crée des clés étrangères sous PG, par défaut, les contraintes sont de type « ON DELETE NO ACTION ».
Il n’existe pas de moyen simple de remplacer par un ‘ON DELETE CASCADE’, à part effacer la relation puis la recréer. Comment faire alors pour appliquer cette modification sur toute une base sans (trop) se compliquer la vie ?
Une autre astuce (mais qui nécessite de rendre la DB indisponible le temps de la manipulation) consiste à faire un export de la base avec pg_dump puis la réimporter avec un ‘sed’ bien senti. Voici comment nous faisons :
psql -c "CREATE DATABASE db_cible ..." pg_dump -h 10.1.1.61 db_source | sed 's/FOREIGN KEY (\(.*\)) REFERENCES \(.*)\);/FOREIGN KEY (\1) REFERENCES \2 ON DELETE CASCADE;/' | psql db_cible
That’s it. La base db_cible contient les mêmes données que db_source mais avec les ‘ON DELETE CASCADE’ qui vont bien.