PostgreSQLでは、バージョン9.0を使用して「適切な」方法でのみこれを解決できます。これは、そこで延期できるように一意の制約を定義できるためです。
PostgreSQL 9.0では、次のようにするだけです。
create table label (
id_label serial not null,
rank integer not null,
title text not null,
constraint pri primary key (id_label)
);
alter table label add constraint unique_rank unique (rank)
deferrable initially immediate;
次に、更新は次のように簡単です。
begin;
set constraints unique_rank DEFERRED;
update rank
set rank = case when rank = 20 then 10 else 20 end
where id_label in (1,2);
commit;
編集:
トランザクション内で制約を遅延に設定する必要がない場合は、制約をinitially deferred
として定義するだけです。 。