Theo nhận xét trước đây, nó phải là một vấn đề. Điều đó nói rằng, có một lệnh có thể là những gì bạn đang tìm kiếm - nó sẽ đặt các ràng buộc thành trì hoãn để chúng được kiểm tra trên COMMIT, không phải trên mỗi lần xóa. Nếu bạn chỉ thực hiện một lần XÓA lớn tất cả các hàng, điều đó sẽ không tạo ra sự khác biệt, nhưng nếu bạn đang thực hiện từng phần một thì sẽ có.
SET CONSTRAINTS ALL DEFERRED
là những gì bạn đang tìm kiếm trong trường hợp đó. Lưu ý rằng các ràng buộc phải được đánh dấu là DEFERRABLE
trước khi chúng có thể được hoãn lại. Ví dụ:
ALTER TABLE table_name
ADD CONSTRAINT constraint_uk UNIQUE(column_1, column_2)
DEFERRABLE INITIALLY IMMEDIATE;
Sau đó, ràng buộc có thể được hoãn lại trong một giao dịch hoặc chức năng như sau:
CREATE OR REPLACE FUNCTION f() RETURNS void AS
$BODY$
BEGIN
SET CONSTRAINTS ALL DEFERRED;
-- Code that temporarily violates the constraint...
-- UPDATE table_name ...
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;