С 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
.