PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Verschieben (aktualisieren) Sie eindeutige Spaltenwerte in PostgreSQL

Dies ist in der Tat etwas verwirrend, da alle anderen Einschränkungen auf Anweisungsebene ausgewertet werden, während DML-Operationen nur PK/eindeutige Einschränkungen auf Zeilenebene ausgewertet werden.

Aber Sie können das umgehen, indem Sie die Primärschlüssel-Einschränkung als aufschiebbar deklarieren:

create table tbl_test 
(
  testkey   INTEGER,
  constraint pk_tbl_test primary key (testkey) deferrable initially immediate
);

insert into tbl_test values (1), (2);

set constraints all deferred;

update tbl_test
   set testkey = testkey +1;

Verzögerte Einschränkungen haben einen gewissen Overhead, also indem Sie sie als initially immediate definieren dieser Overhead wird auf ein Minimum beschränkt. Sie können die Constraint-Evaluierung verschieben, wenn Sie sie benötigen, indem Sie set constraint verwenden .

Die eigentliche Frage ist jedoch:Warum sollten Sie dies für einen Primärschlüsselwert tun? Die PK-Werte haben keinerlei Bedeutung, daher erscheint es eher unnötig, alle Werte zu erhöhen (unabhängig vom verwendeten DBMS)