MySQL saveOrUpdateの保存または更新


1.リード
プロジェクト開発の過程で、書き込み時にすでに存在する場合は上書きすればよいデータがあります.これにより、一意キーの競合エラーの複数回の書き込みを防止できます.次に、2つのMyBatisプロファイルでsaveOrUpdateを使用する例を示します.

<insert id="saveOrUpdate" parameterType="TestVo">
    insert into table_name (
        col1,
        col2,
        col3
    )
    values (
        #{field1},
        #{field2},
        #{field3}
    )
    on duplicate key update
        col1 = #{field1},
        col2 = #{field2},
        col3 = #{field3}
insert>  


<insert id="batchSaveOrUpdate" parameterType="java.util.List">
    insert into table_name (
        col1,
        col2,
        col3
    )
    <foreach collection="list" item="item" index="index" separator=",">
        values (
            #{item.field1},
            #{item.field2},
            #{item.field3}
        )
    foreach>
    on duplicate key update
        col1 = VALUES (col1),
        col2 = VALUES (col2),
        col3 = VALUES (col3)
insert>

実際には、1行データon duplicate key updateについても、バッチデータ保存と同様にVALUES式(VALUESが新しいデータを指す)を使用することができる.
上の例でMySQL ON DUPLICATE KEY UPDATEの文法を初めて知りました.
2.ON DUPLICATE KEY UPDATE構文
MySQLのON DUPLICATE KEY UPDATE構文は、ON DUPLICATE KEY UPDATE句を含むINSERT句です.この文がデータベースにすでに存在する場合(このデータに含まれるプライマリ・キーまたはユニーク・キーがデータベースに存在する場合)、データベースに対応する古いデータが更新されます.
次の2つのsql文は等価で、tableテーブルのaは一意のキーです.
INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

UPDATE table SET c=c+1 WHERE a=1;

tableテーブルにaという一意キーだけでなくbも一意キーが存在する場合、以下の2つの文は等価である
INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;  

UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;

上のupdate文の意味は、a=1またはb=2を満たすデータをテーブルから取り出し、更新操作を行うことです.
次の質問に重点を置きます.
2.1複数の一意キー
1つのキーに複数の一意キーが含まれている場合(複数の一意キーは、1つのキーに複数のフィールドが含まれているのではなく、複数のキーが含まれている場合)は、複数の一意キーが複数のデータに対応しているかどうかに注意してください.
上記第2の例から分かるように、ON DUPLICATE KEY UPDATEは、a=1 b=2に従って1つのデータをマッチングして更新し、このとき複数のデータに対応すると、このような更新操作に不確実性がある.(別の観点から、複数の一意キーが1つずつ対応していれば、更新操作に問題はない)
2.2影響行数の戻り値
データが存在しない場合、新規データ戻り1データが存在し、変更データ戻り2データが存在するが、変化なしに0を返す
データが存在するか否かは一意キー判定、データが修正されているか否かはON DUPLICATE KEY UPDATE以降の文判定による
次に、ON DUPLICATE KEY UPDATEの戻り値の様々なケースの簡単な例を示します.
mysql> CREATE TABLE test1 (a INT PRIMARY KEY AUTO_INCREMENT , b INT, c INT);
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO test1(a, b ,c) VALUES (1, 1, 1);
Query OK, 1 row affected (0.00 sec)

mysql> select * from test1;
+---+------+------+
| a | b    | c    |
+---+------+------+
| 1 |    1 |    1 |
+---+------+------+
1 row in set (0.00 sec)

mysql> INSERT INTO test1(a, b ,c) VALUES (1, 1, 1) ON DUPLICATE KEY UPDATE c = c + 1;
Query OK, 2 rows affected (0.00 sec)

mysql> select * from test1;
+---+------+------+
| a | b    | c    |
+---+------+------+
| 1 |    1 |    2 |
+---+------+------+
1 row in set (0.00 sec)

mysql> INSERT INTO test1(a, b ,c) VALUES (2, 2, 2) ON DUPLICATE KEY UPDATE c = c + 1;
Query OK, 1 row affected (0.00 sec)

mysql> select * from test1;
+---+------+------+
| a | b    | c    |
+---+------+------+
| 1 |    1 |    2 |
| 2 |    2 |    2 |
+---+------+------+
2 rows in set (0.00 sec)

mysql> INSERT INTO test1(a, b ,c) VALUES (2, 2, 3) ON DUPLICATE KEY UPDATE c = VALUES(c);
Query OK, 2 rows affected (0.00 sec)

mysql> select * from test1;
+---+------+------+
| a | b    | c    |
+---+------+------+
| 1 |    1 |    2 |
| 2 |    2 |    3 |
+---+------+------+
2 rows in set (0.00 sec)
mysql> INSERT INTO test1(a, b ,c) VALUES (2, 2, 3) ON DUPLICATE KEY UPDATE c = VALUES(c);
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test1;
+---+------+------+
| a | b    | c    |
+---+------+------+
| 1 |    1 |    2 |
| 2 |    2 |    3 |
+---+------+------+
2 rows in set (0.00 sec)

注意戻り値と新規、変更の関係
2.3新旧データ引用
上の例から、トリガと類比して、ON DUPLICATE KEY UPDATE句の後に、フィールド名を直接使用して、古いデータを参照します.VALUESを使用して、更新する新しいデータを参照します.(例えば:c=c+1は古いデータのcフィールドに1c=VALUES(c)を加えると古いデータを新しいデータで上書きする)
2.4一括保存ON DUPLICATE KEY UPDATEを使用したシーンを一括保存します.記事の最初の例の2番目の使い方を参照してください.
公式サイトより:http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html
トランスポートドア========>