Với PostgreSQL, điều này chỉ có thể được giải quyết theo cách "tốt đẹp" bằng cách sử dụng Phiên bản 9.0 vì bạn có thể xác định các ràng buộc duy nhất có thể hoãn lại ở đó.
Với PostgreSQL 9.0, bạn chỉ cần thực hiện:
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;
Sau đó, cập nhật đơn giản như sau:
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;
Chỉnh sửa:
Nếu bạn không muốn bận tâm đến việc đặt ràng buộc hoãn lại trong giao dịch của mình, bạn có thể chỉ cần xác định ràng buộc là initially deferred
.