Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Atomare mehrzeilige Aktualisierung mit einer eindeutigen Einschränkung

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 .