Per komentar sebelumnya, itu harus menjadi masalah. Yang mengatakan, ada perintah yang mungkin Anda cari - itu akan mengatur batasan untuk ditangguhkan sehingga mereka diperiksa di COMMIT, bukan pada setiap penghapusan. Jika Anda hanya melakukan satu DELETE besar dari semua baris, itu tidak akan membuat perbedaan, tetapi jika Anda melakukannya berkeping-keping, itu akan terjadi.
SET CONSTRAINTS ALL DEFERRED
adalah apa yang Anda cari dalam kasus itu. Perhatikan bahwa batasan harus ditandai sebagai DEFERRABLE
sebelum dapat ditangguhkan. Misalnya:
ALTER TABLE table_name
ADD CONSTRAINT constraint_uk UNIQUE(column_1, column_2)
DEFERRABLE INITIALLY IMMEDIATE;
Batasan tersebut kemudian dapat ditangguhkan dalam transaksi atau fungsi sebagai berikut:
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;