PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Đã vượt quá giới hạn độ sâu ngăn xếp trong PostgresQL (Sau khi kích hoạt xóa)

Cho đến nay, đó là những gì sẽ xảy ra:

  1. Xóa con1.
  2. Kích hoạt xóa cha mẹ.
  3. Xóa n anh chị em của child1 bởi DELETE CASCADE .
  4. Gọi cùng một trình kích hoạt n lần.
  5. 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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle DBMS_LOB.WRITEAPPEND thành Chuyển đổi Postgres

  2. PostgreSQL:nối tiếp và danh tính

  3. PostgreSQL:Tại sao truy vấn này không sử dụng chỉ mục của tôi?

  4. Tổng tích lũy (đang chạy) với django orm và postgresql

  5. Viết bất thường Skew trong Oracle và PostgreSQL không khôi phục giao dịch