MySQL saveOrUpdateの保存または更新
10265 ワード
1.リード
プロジェクト開発の過程で、書き込み時にすでに存在する場合は上書きすればよいデータがあります.これにより、一意キーの競合エラーの複数回の書き込みを防止できます.次に、2つのMyBatisプロファイルでsaveOrUpdateを使用する例を示します.
実際には、1行データ
上の例でMySQL
2.ON DUPLICATE KEY UPDATE構文
MySQLの
次の2つのsql文は等価で、tableテーブルのaは一意のキーです.
tableテーブルにaという一意キーだけでなくbも一意キーが存在する場合、以下の2つの文は等価である
上のupdate文の意味は、a=1またはb=2を満たすデータをテーブルから取り出し、更新操作を行うことです.
次の質問に重点を置きます.
2.1複数の一意キー
1つのキーに複数の一意キーが含まれている場合(複数の一意キーは、1つのキーに複数のフィールドが含まれているのではなく、複数のキーが含まれている場合)は、複数の一意キーが複数のデータに対応しているかどうかに注意してください.
上記第2の例から分かるように、
2.2影響行数の戻り値
データが存在しない場合、新規データ戻り1データが存在し、変更データ戻り2データが存在するが、変化なしに0を返す
データが存在するか否かは一意キー判定、データが修正されているか否かは
次に、
注意戻り値と新規、変更の関係
2.3新旧データ引用
上の例から、トリガと類比して、
2.4一括保存
公式サイトより:http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html
トランスポートドア========>
プロジェクト開発の過程で、書き込み時にすでに存在する場合は上書きすればよいデータがあります.これにより、一意キーの競合エラーの複数回の書き込みを防止できます.次に、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
トランスポートドア========>