Sejauh ini Anda itulah yang terjadi:
- Hapus anak1.
- Memicu penghapusan induk.
- Menghapus
nsaudara kandung anak1 denganDELETE CASCADE. - Memanggil pemicu yang sama
nkali. - Tidak ada lagi saudara kandung yang tersisa.
Tidak ada putaran tanpa akhir, tetapi tetap n panggilan dari pemicu. Itu bisa menjelaskan mengapa batas kedalaman tumpukan Anda terlampaui, tetapi Anda bisa memperbaikinya dengan meningkatkan batas. Hal yang sama dapat terjadi lagi dengan n greater yang lebih besar .
Sebagai alternatif, ganti pemicu Anda dengan:
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();
Dan ganti batasan FK dengan versi tanpa ON DELETE CASCADE . Contoh kode:
Sekarang, untuk DELETE seluruh keluarga, Anda tidak dapat menghapus orang tua seperti sebelumnya (sekarang dilarang oleh FK). Alih-alih DELETE anak mana pun.
Harus lebih cepat juga.