Mysql
 sql >> Database >  >> RDS >> Mysql

Aggiornamento atomico su più righe con un vincolo unico

Con PostgreSQL questo può essere risolto solo in un modo "bello" usando la versione 9.0 perché puoi definire vincoli univoci da differire lì.

Con PostgreSQL 9.0 faresti semplicemente:

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;

Quindi l'aggiornamento è così semplice:

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;

Modifica:
Se non vuoi preoccuparti di impostare il vincolo su differito all'interno della tua transazione, puoi semplicemente definire il vincolo come initially deferred .