Това наистина е малко объркващо, тъй като всички други ограничения се оценяват на ниво израз, само PK/уникално ограничение се оценяват на ниво ред по време на DML операции.
Но можете да заобиколите това, като декларирате ограничението на първичния ключ като отлагаемо:
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;
Отложените ограничения имат някои допълнителни разходи, така че като ги дефинирате като initially immediate
тези режийни разходи са сведени до минимум. Можете да отложите оценката на ограничението, когато имате нужда от нея, като използвате set constraint
.
Истинският въпрос обаче е:защо трябва да правите това на стойност на първичен ключ? PK стойностите нямат никакво значение, така че изглежда доста ненужно да се увеличават всички стойности (независимо от използваната СУБД)