Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Atualização atômica de várias linhas com uma restrição exclusiva


Com o PostgreSQL isso só pode ser resolvido de uma maneira "legal" usando a Versão 9.0 porque você pode definir restrições exclusivas para serem adiáveis ​​lá.

Com o PostgreSQL 9.0 você simplesmente faria:
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;

Então a atualização é tão simples assim:
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;

Edit:
Se você não quiser se incomodar em definir a restrição para adiada dentro de sua transação, você pode simplesmente definir a restrição como initially deferred .