Secondo i commenti precedenti, dovrebbe essere un problema. Detto questo, c'è un comando che potrebbe essere quello che stai cercando:imposterà i vincoli su differito in modo che vengano controllati su COMMIT, non su ogni eliminazione. Se stai facendo un solo grande DELETE di tutte le righe, non farà alcuna differenza, ma se lo fai a pezzi, lo farà.
SET CONSTRAINTS ALL DEFERRED
è quello che stai cercando in quel caso. Nota che i vincoli devono essere contrassegnati come DEFERRABLE
prima che possano essere differiti. Ad esempio:
ALTER TABLE table_name
ADD CONSTRAINT constraint_uk UNIQUE(column_1, column_2)
DEFERRABLE INITIALLY IMMEDIATE;
Il vincolo può quindi essere differito in una transazione o funzione come segue:
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;