Indtil videre er det, hvad der sker:
- Slet barn1.
- Udløser sletning af forælder.
- Sletter
n
søskende til barn1 vedDELETE CASCADE
. - Kalder samme trigger
n
gange. - Der er ikke flere søskende tilbage.
Ingen endeløs loop, men stadig n
påkaldelser af udløseren. Det kunne forklare, hvorfor din stakdybdegrænse blev overskredet, men du kunne rette op på det ved at øge grænsen. Det samme kunne ske igen med en større n
.
Som et alternativ kan du erstatte din trigger 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();
Og erstat FK-begrænsningen med en version uden ON DELETE CASCADE
. Kodeeksempel:
Nu til DELETE
en hel familie, kan man ikke slette forælderen som før (nu forbudt af FK). I stedet for DELETE
ethvert barn.
Det burde også være hurtigere.