Med PostgreSQL kan dette kun løses på en "pæn" måde ved hjælp af Version 9.0, fordi du kan definere unikke begrænsninger, der skal udskydes der.
Med PostgreSQL 9.0 gør du blot:
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;
Så er opdateringen så enkel som denne:
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;
Rediger:
Hvis du ikke vil bekymre dig om at indstille begrænsningen til udskudt i din transaktion, kan du blot definere begrænsningen som initially deferred
.