Detta är verkligen lite förvirrande eftersom alla andra begränsningar utvärderas på en satsnivå, endast PK/unik begränsning utvärderas på en radnivå under DML-operationer.
Men du kan komma runt det genom att förklara den primära nyckelbegränsningen som uppskjuten:
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;
Uppskjutna begränsningar har viss omkostnad, så genom att definiera den som initially immediate
denna omkostnad hålls till ett minimum. Du kan skjuta upp begränsningsutvärderingen när du behöver den genom att använda set constraint
.
Den verkliga frågan är dock:varför skulle du behöva göra detta på ett primärt nyckelvärde? PK-värdena har ingen som helst betydelse, så det verkar ganska onödigt att öka alla värden (oavsett vilken DBMS som används)