Tot nu toe is dat wat er gebeurt:
- Verwijder kind1.
- Trigger verwijdering van ouder.
- Verwijdert
n
broers en zussen van kind1 doorDELETE CASCADE
. - Roept dezelfde trigger
n
. op keer. - Er zijn geen broers en zussen meer over.
Geen eindeloze lus, maar toch n
aanroepen van de trigger. Dat zou kunnen verklaren waarom de limiet van uw stapeldiepte is overschreden, maar u kunt dit oplossen door de limiet te verhogen. Hetzelfde kan opnieuw gebeuren met een grotere n
.
Vervang als alternatief uw trigger door:
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();
En vervang de FK-beperking door een versie zonder ON DELETE CASCADE
. Codevoorbeeld:
Nu, om DELETE
een hele familie, je kunt de ouder niet verwijderen zoals voorheen (nu verboden door FK). In plaats daarvan DELETE
elk kind.
Zou ook sneller moeten zijn.