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

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

テーブル:

test_table (id INT UNIQUE,
            name char(20), 
            address char(20),
            version INT,
            other blob);

要件:

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

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

  1. 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);
    
  2. 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);          ←入替
    

よろしくお願いします。