Så långt är det vad som händer:
- Ta bort barn1.
- Utlöser borttagning av förälder.
- Tar bort
n
syskon till barn1 genom attDELETE CASCADE
. - Anropar samma utlösare
n
gånger. - Inga fler syskon kvar.
Ingen ändlös loop, men ändå n
anrop av utlösaren. Det kan förklara varför din stackdjupsgräns överskreds, men du kan fixa det genom att öka gränsen. Samma sak kan hända igen med ett större n
.
Som ett alternativ, ersätt din utlösare med:
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();
Och ersätt FK-begränsningen med en version utan ON DELETE CASCADE
. Kodexempel:
Nu till DELETE
en hel familj kan man inte radera föräldern som tidigare (nu förbjudet av FK). Istället DELETE
vilket barn som helst.
Bör vara snabbare också.