Sejauh ini Anda itulah yang terjadi:
- Hapus anak1.
- Memicu penghapusan induk.
- Menghapus
n
saudara kandung anak1 denganDELETE CASCADE
. - Memanggil pemicu yang sama
n
kali. - 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.