Så långt är det vad som händer:
- Ta bort barn1.
- Utlöser borttagning av förälder.
- Tar bort
nsyskon till barn1 genom attDELETE CASCADE. - Anropar samma utlösare
ngå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å.