Zgodnie z poprzednimi komentarzami powinien być problem. To powiedziawszy, istnieje polecenie, które może być tym, czego szukasz — ustawi ograniczenia na odroczone, aby były sprawdzane przy COMMIT, a nie przy każdym usunięciu. Jeśli wykonujesz tylko jedno duże DELETE ze wszystkich rzędów, nie będzie to miało znaczenia, ale jeśli robisz to w częściach, to zrobi.
SET CONSTRAINTS ALL DEFERRED
jest tym, czego szukasz w takim przypadku. Zwróć uwagę, że ograniczenia muszą być oznaczone jako DEFERRABLE
zanim będą mogły zostać odroczone. Na przykład:
ALTER TABLE table_name
ADD CONSTRAINT constraint_uk UNIQUE(column_1, column_2)
DEFERRABLE INITIALLY IMMEDIATE;
Ograniczenie można następnie odroczyć w transakcji lub funkcjonować w następujący sposób:
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;