Bisher passiert Folgendes:
- Kind1 löschen.
- Löst das Löschen des übergeordneten Elements aus.
- Löscht
n
Geschwister von Kind1 durchDELETE CASCADE
. - Ruft denselben Trigger
n
auf 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.