Jest to rzeczywiście nieco mylące, ponieważ wszystkie inne ograniczenia są oceniane na poziomie instrukcji, tylko ograniczenia PK/unikalne są oceniane na poziomie wiersza podczas operacji DML.
Możesz jednak obejść ten problem, deklarując ograniczenie klucza podstawowego jako możliwe do odroczenia:
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;
Odroczone ograniczenia mają pewne obciążenie, więc definiując je jako initially immediate
ten koszt jest ograniczony do minimum. Możesz odroczyć ocenę ograniczenia, kiedy tego potrzebujesz, używając set constraint
.
Prawdziwe pytanie brzmi jednak:dlaczego miałbyś to robić na wartości klucza podstawowego? Wartości PK nie mają żadnego znaczenia, więc wydaje się raczej niepotrzebne zwiększanie wszystkich wartości (niezależnie od używanego DBMS)