sql >> データベース >  >> RDS >> Mysql

一意の制約を持つアトミック複数行の更新

    PostgreSQLでは、バージョン9.0を使用して「適切な」方法でのみこれを解決できます。これは、そこで延期できるように一意の制約を定義できるためです。

    PostgreSQL 9.0では、次のようにするだけです。

    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;
    

    次に、更新は次のように簡単です。

    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;
    

    編集:
    トランザクション内で制約を遅延に設定する必要がない場合は、制約をinitially deferredとして定義するだけです。 。



    1. SQLServer2019でファイルをコピーする新しい方法

    2. 緯度と経度の2点で距離を計算します

    3. 文字列の特定の部分で並べ替える方法は?

    4. MySQLクエリに6秒以上かかる