

MySQLのSQL文について，調べた限りだと分からないことがあり，  
質問させてください。

以下のような要件でテーブルを更新するSQLを検討しています。

テーブル：

[code]

    test_table (id INT UNIQUE,
                name char(20), 
                address char(20),
                version INT,
                other blob);
    
[/code]

要件：

  1. idをユニークにして，idがない時はINSERT, ある時は，そのidのレコードをUPDATE (即ち，DUPLICATE KEY UPDATEの要件そのものです。）
  2. バージョン(version)に基づき，新規追加するデータのversionが既に登録済のものよりも古い場合，更新をしない。

上記を満たすSQLを検討しているのですが，なかなか綺麗に書けず，以下2点で疑問があります。

  1. IFによる条件を大量に書かないといけない  
現在，IF条件を使い、下記のようなSQLで上記を満たすことができています。  
しかし，下記では同じIF部分が繰り返されており，あまり効率的とか思えません。  
また，下記の場合UPDATE自体をしていないのではなく，versionの値が古い場合は既に格納済のデータで再度UPDATEしているので，この点も効率的でないと思います。  
仕方がないのかもしれませんが，より良い実装などあれば，ご教授下さい。  
SQL文：

[code]     INSERT INTO test_table(id, name, address, version, other) VALUES
(・・・)

      ON DUPLICATE KEY UPDATE
        name   =IF(VALUES(version) > version, VALUES(name), name),
        address=IF(VALUES(version) > version, VALUES(address), address),
        other  =IF(VALUES(version) > version, VALUES(other), other),
        version=IF(VALUES(version) > version, VALUES(version), version);
    
[/code]

  2. DUPLICATE KEY UPDATE以降の順番が入れ替わると，失敗する。  
下記，SQLの場合，otherの更新が行われません。これは，versionの値が書き換わることで，other部分のIF条件が適切に働いていないのが原因と思われます。  
ただ、今回はversionだけが条件なので良いのですが，複数の値を条件式に組み込む場合，これだと困る場合があるかなと思います。  
そもそものSQL自体がおかしいのかもしれませんが，SQLの書き方で何とかなる部分があれば，お教えいただければと思います。  
SQL文：

[code]     INSERT INTO test_table(id, name, address, version, other) VALUES
(・・・)

      ON DUPLICATE KEY UPDATE
        name   =IF(VALUES(version) > version, VALUES(name), name),
        address=IF(VALUES(version) > version, VALUES(address), address),
        version=IF(VALUES(version) > version, VALUES(version), version),  ←ここの
        other  =IF(VALUES(version) > version, VALUES(other), other);          ←入替
    
[/code]

よろしくお願いします。


CC BY-SA 3.0
2016-01-04T09:16:25.903
20581
2016-01-04T09:24:05.507
2016-01-04T09:24:05.507
76
11079
question
mysql sql database
条件に基づいたDUPLICATE KEY UPDATEの仕方