Met PostgreSQL kan dit alleen op een "leuke" manier worden opgelost met versie 9.0, omdat je unieke beperkingen kunt definiëren om daar uitgesteld te worden.
Met PostgreSQL 9.0 zou je gewoon doen:
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;
Dan is de update zo eenvoudig:
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;
Bewerken:
Als u niet de moeite wilt nemen om de beperking in te stellen op uitgesteld binnen uw transactie, kunt u de beperking eenvoudig definiëren als initially deferred
.