Bisher passiert Folgendes:
- Kind1 löschen.
- Löst das Löschen des übergeordneten Elements aus.
- Löscht
nGeschwister von Kind1 durchDELETE CASCADE. - Ruft denselben Trigger
nauf mal. - Keine Geschwister mehr übrig.
Keine Endlosschleife, aber trotzdem n Aufrufe des Triggers. Das könnte erklären, warum Ihr Stapeltiefenlimit überschritten wurde, aber Sie können es beheben, indem Sie das Limit erhöhen. Dasselbe könnte mit einem größeren n wieder passieren .
Alternativ ersetzen Sie Ihren Trigger durch:
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();
Und ersetzen Sie die FK-Einschränkung durch eine Version ohne ON DELETE CASCADE . Codebeispiel:
Nun zum DELETE eine ganze Familie, Sie können den Elternteil nicht wie zuvor löschen (jetzt von FK verboten). Stattdessen DELETE jedes Kind.
Sollte auch schneller sein.