Isso é realmente um pouco confuso, pois todas as outras restrições são avaliadas em um nível de instrução, apenas a restrição PK/única é avaliada em um nível por linha durante as operações DML.
Mas você pode contornar isso declarando a restrição de chave primária como adiável:
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;
As restrições adiadas têm alguma sobrecarga, portanto, definindo-a como
initially immediate
esta sobrecarga é reduzida ao mínimo. Você pode adiar a avaliação da restrição quando precisar usando set constraint
. A verdadeira questão, no entanto, é:por que você precisaria fazer isso em um valor de chave primária? Os valores de PK não têm nenhum significado, então parece desnecessário incrementar todos os valores (independentemente do DBMS que está sendo usado)