Questo crea effettivamente un po' di confusione poiché tutti gli altri vincoli vengono valutati a livello di istruzione, solo il vincolo PK/unique viene valutato a livello di riga durante le operazioni DML.
Ma puoi aggirare il problema dichiarando il vincolo della chiave primaria come differibile:
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;
I vincoli posticipati hanno un sovraccarico, quindi definendolo come initially immediate
questo sovraccarico è ridotto al minimo. Puoi posticipare la valutazione del vincolo quando ne hai bisogno usando set constraint
.
La vera domanda, tuttavia, è:perché dovresti farlo su un valore di chiave primaria? I valori PK non hanno alcun significato, quindi sembra piuttosto inutile incrementare tutti i valori (indipendentemente dal DBMS utilizzato)