Mit PostgreSQL lässt sich das nur mit Version 9.0 "schön" lösen, weil man dort Unique Constraints deferable definieren kann.
Mit PostgreSQL 9.0 würden Sie einfach Folgendes tun:
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;
Dann ist das Update so einfach:
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;
Bearbeiten:
Wenn Sie sich nicht die Mühe machen möchten, die Einschränkung innerhalb Ihrer Transaktion auf verzögert zu setzen, können Sie die Einschränkung einfach als initially deferred
definieren .