Jusqu'à présent, c'est ce qui se passe :
- Supprimer enfant1.
- Déclenche la suppression du parent.
- Supprime
n
frères et sœurs de child1 parDELETE CASCADE
. - Appelle le même déclencheur
n
fois. - Plus de frères et sœurs.
Pas de boucle sans fin, mais toujours n
appels du déclencheur. Cela pourrait expliquer pourquoi votre limite de profondeur de pile a été dépassée, mais vous pouvez y remédier en augmentant la limite. La même chose pourrait se reproduire avec un plus grand n
.
Comme alternative, remplacez votre déclencheur par :
CREATE OR REPLACE FUNCTION delete_family()
RETURNS TRIGGER AS
$func$
BEGIN
DELETE FROM child WHERE parent_id = OLD.parent_id;
DELETE FROM parent WHERE parent_id = OLD.parent_id; -- done after 1st call
RETURN NULL;
END
$func$ LANGUAGE plpgsql; -- don't quote the language name!
CREATE TRIGGER delete_family
AFTER DELETE ON child
FOR EACH ROW EXECUTE PROCEDURE delete_family();
Et remplacez la contrainte FK par une version sans ON DELETE CASCADE
. Exemple de code :
Maintenant, pour DELETE
une famille entière, vous ne pouvez pas supprimer le parent comme avant (maintenant interdit par FK). Au lieu de cela DELETE
n'importe quel enfant.
Ça devrait aussi être plus rapide.