DUPLICATE KEY UDPATEのエミュレーション-落とし穴

MySQLでは、INSERT ... ON DUPLICATE KEY UDPATEを実行できます。 postgresにはそのようなものはまだありません(私が知る限り、MERGEはバージョン8.4に含まれていませんでした)。



同様の動作を実現するためにルールを使用することをお勧めしました。 この場合、ルールを使用することはMERGEよりも優れているように思われ、ルールを作成し...落とし穴に遭遇しました。 カウンターを実装しました。一意のキーがあり、新しいレコードが挿入されるときにそのようなキーが既にテーブルに存在する場合は、代わりにカウンター値を増やします。



シンプルな状況、シンプルなルール。 しかし、最初の挿入時に、このルールが判明しましたが、うまくいきました! その結果、最初の挿入では1が挿入されず、2が挿入されます。



執筆中に、 Fred84はこの状況を詳細に説明するリンクを投げました: archives.postgresql.org/pgsql-bugs/2007-03/msg00080.php



  #CREATE TABLE x(id INT NOT NULL、counter INT NOT NULL DEFAULT 0、PRIMARY KEY(id));
 #ルールxxx ASを作成または置換
     xへの挿入時
    WHERE(EXISTS(SELECT x.id
            xから
           WHERE x.id = new.id))DO INSTEAD UPDATE x SET counter = x.counter + 1
   WHERE x.id = new.id;
 #INSERT INTO x VALUES(1、1);
 #select * from x;
  id | カウンター
 ---- + ---------
   1 |  2 


ご覧のとおり、counter = 2ですが、物事の論理によると1でなければなりません。



All Articles