条件に基づいたDUPLICATE KEY UPDATEの仕方
MySQLのSQL文について,調べた限りだと分からないことがあり,
質問させてください。
以下のような要件でテーブルを更新するSQLを検討しています。
テーブル:
test_table (id INT UNIQUE,
name char(20),
address char(20),
version INT,
other blob);
要件:
- idをユニークにして,idがない時はINSERT, ある時は,そのidのレコードをUPDATE (即ち,DUPLICATE KEY UPDATEの要件そのものです。)
- バージョン(version)に基づき,新規追加するデータのversionが既に登録済のものよりも古い場合,更新をしない。
上記を満たすSQLを検討しているのですが,なかなか綺麗に書けず,以下2点で疑問があります。
IFによる条件を大量に書かないといけない
現在,IF条件を使い、下記のようなSQLで上記を満たすことができています。
しかし,下記では同じIF部分が繰り返されており,あまり効率的とか思えません。
また,下記の場合UPDATE自体をしていないのではなく,versionの値が古い場合は既に格納済のデータで再度UPDATEしているので,この点も効率的でないと思います。
仕方がないのかもしれませんが,より良い実装などあれば,ご教授下さい。
SQL文: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);
DUPLICATE KEY UPDATE以降の順番が入れ替わると,失敗する。
下記,SQLの場合,otherの更新が行われません。これは,versionの値が書き換わることで,other部分のIF条件が適切に働いていないのが原因と思われます。
ただ、今回はversionだけが条件なので良いのですが,複数の値を条件式に組み込む場合,これだと困る場合があるかなと思います。
そもそものSQL自体がおかしいのかもしれませんが,SQLの書き方で何とかなる部分があれば,お教えいただければと思います。
SQL文: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); ←入替
よろしくお願いします。