Ini memang agak membingungkan karena semua batasan lain dievaluasi pada level pernyataan, hanya batasan PK/unik yang dievaluasi pada level per baris selama operasi DML.
Tetapi Anda dapat mengatasinya dengan mendeklarasikan batasan kunci utama sebagai dapat ditangguhkan:
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;
Batasan yang ditangguhkan memang memiliki beberapa overhead, jadi dengan mendefinisikannya sebagai initially immediate
overhead ini dijaga agar tetap minimum. Anda dapat menunda evaluasi kendala saat Anda membutuhkannya dengan menggunakan set constraint
.
Namun pertanyaan sebenarnya adalah:mengapa Anda perlu melakukan ini pada nilai kunci utama? Nilai PK tidak memiliki arti apa pun, jadi sepertinya tidak perlu menambah semua nilai (terlepas dari DBMS yang digunakan)