他のすべての制約はステートメントレベルで評価され、DML操作中に行ごとのレベルで評価されるのはPK /一意制約のみであるため、これは確かに少し混乱します。
ただし、主キー制約を延期可能として宣言することで、これを回避できます。
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値はまったく意味がないため、(使用されているDBMSに関係なく)すべての値をインクリメントする必要はないようです。