PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL:disabilitazione dei vincoli

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;