Med PostgreSQL kan detta bara lösas på ett "snyggt" sätt med version 9.0 eftersom du kan definiera unika begränsningar som ska kunna skjutas upp där.
Med PostgreSQL 9.0 gör du helt enkelt:
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;
Då är uppdateringen så enkel som denna:
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;
Redigera:
Om du inte vill bry dig om att ställa in begränsningen till uppskjuten i din transaktion, kan du helt enkelt definiera begränsningen som initially deferred
.