Cho đến nay, đó là những gì sẽ xảy ra:
- Xóa con1.
- Kích hoạt xóa cha mẹ.
- Xóa
n
anh chị em của child1 bởiDELETE CASCADE
. - Gọi cùng một trình kích hoạt
n
lần. - Không còn anh chị em nào nữa.
Không có vòng lặp vô tận, nhưng vẫn n
lệnh gọi của trình kích hoạt. Điều đó có thể giải thích tại sao giới hạn độ sâu ngăn xếp của bạn bị vượt quá, nhưng bạn có thể khắc phục bằng cách tăng giới hạn. Điều tương tự cũng có thể xảy ra với n
lớn hơn .
Thay vào đó, hãy thay thế trình kích hoạt của bạn bằng:
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();
Và thay thế ràng buộc FK bằng một phiên bản không có ON DELETE CASCADE
. Ví dụ về mã:
Bây giờ, để DELETE
cả một gia đình, bạn không thể xóa cha mẹ như trước (bây giờ bị cấm bởi FK). Thay vào đó DELETE
bất kỳ đứa trẻ nào.
Cũng sẽ nhanh hơn.