Засега се случва това:
- Изтриване на дете1.
- Задейства изтриване на родител.
- Изтрива
n
братя и сестри на дете1 отDELETE CASCADE
. - Извиква същия тригер
n
пъти. - Няма останали повече братя и сестри.
Без безкраен цикъл, но все пак n
извиквания на тригера. Това може да обясни защо лимитът на дълбочината на стека е надвишен, но можете да го поправите, като увеличите лимита. Същото може да се случи отново с по-голямо n
.
Като алтернатива заменете тригера си с:
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();
И заменете ограничението FK с версия без ON DELETE CASCADE
. Пример за код:
Сега към DELETE
цяло семейство, не можеш да изтриеш родителя както преди (сега е забранено от FK). Вместо DELETE
всяко дете.
Трябва да е и по-бързо.