MYSQLのON DUPLICATE KEY UDATEでデータをinsertOrUpdate操作します.
2853 ワード
本文は高爽𞓜Coderから来ました.原文の住所:
http://blog.csdn.net/ghsau/article/details/23557915、転載は明記してください.
データベースに記録を挿入すると、ある条件に該当するデータが存在する場合、それを修正します.存在しない場合、追加します.つまり、saveOrUpdate操作です.このような制御は、ビジネス層に置くこともできますし、データベース層に置くこともできます.Oracleのmerge文のように、Oracleのmerge文のように、ここで述べたMySQLのINSERT...ON DUPLICATE KEY UDATE文のように、ほとんどのデータベースがこの需要をサポートしています.
このステートメントは、一つのフィールドaにunique indexが付加されたような、一意のインデックスまたはメインキーに基づいています.そして、テーブルにはもう一つのレコード値があります.次の二つのステートメントは同じ効果があります.
[sql]view plincopyコードシートの派生をコードシートで確認します.
ON DUPLICATE KEY UPDATEの後ろに複数のフィールドを置き、英字で区切ることができます.ON DUPLICATE KEY UDATEを使って、最終的に新しい行を挿入したら、影響を受ける行数は1で、既存の行のデータを修正したら、影響を受ける行数は2です.
フィールドbにunique indexが追加されている場合、この文と以下のudate文は等価です.
[sql]view plincopyコードシートの派生をコードシートで確認します.
a=1 OR b=2が複数行にマッチしている場合、一行だけが修正されます.通常、ON DUPLICATE KEY UPDATE文では、複数の一意インデックスの場合は避けるべきです.複数のデータを挿入または更新したい場合、更新されたフィールドは他のフィールドに基づいて演算したい場合、次のような文が使用されます.
[sql]view plincopyコードシートの派生をコードシートで確認します.
ON DUPLICATE KEY UPDATEの後にVALES()の方法を使用すると、この文は次の2つの文と同じです.
[sql]view plincopyコードシートの派生をコードシートで確認します.
一つの表にatotが含まれている場合incrementのフィールドは、毎回insertデータの後、last_を通過することができます.insert_ID()メソッドは最後に自動的に生成された値を返します.INSERT...ON DUPLICATE KEY UDATE文でデータを修正したら、またlast_を通過します.insert_ID()メソッドで取得した値は正しくないです.実際のテストでは、表に3つのデータを追加した場合、last_を通過します.insert_ID()メソッドで得られた値は3ですが、この文でデータを修正した後、ラスボス(u)を通過します.insert_id()法で得られた値は4です.この問題を解決したいなら、次のような文を使ってもいいです.
[sql]view plincopyコードシートの派生をコードシートで確認します.
英語の原文:
https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
本文は高爽𞓜Coderから来ました.原文の住所:
http://blog.csdn.net/ghsau/article/details/23557915、転載は明記してください.
http://blog.csdn.net/ghsau/article/details/23557915、転載は明記してください.
データベースに記録を挿入すると、ある条件に該当するデータが存在する場合、それを修正します.存在しない場合、追加します.つまり、saveOrUpdate操作です.このような制御は、ビジネス層に置くこともできますし、データベース層に置くこともできます.Oracleのmerge文のように、Oracleのmerge文のように、ここで述べたMySQLのINSERT...ON DUPLICATE KEY UDATE文のように、ほとんどのデータベースがこの需要をサポートしています.
このステートメントは、一つのフィールドaにunique indexが付加されたような、一意のインデックスまたはメインキーに基づいています.そして、テーブルにはもう一つのレコード値があります.次の二つのステートメントは同じ効果があります.
[sql]view plincopyコードシートの派生をコードシートで確認します.
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;
ON DUPLICATE KEY UPDATEの後ろに複数のフィールドを置き、英字で区切ることができます.ON DUPLICATE KEY UDATEを使って、最終的に新しい行を挿入したら、影響を受ける行数は1で、既存の行のデータを修正したら、影響を受ける行数は2です.
フィールドbにunique indexが追加されている場合、この文と以下のudate文は等価です.
[sql]view plincopyコードシートの派生をコードシートで確認します.
UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
a=1 OR b=2が複数行にマッチしている場合、一行だけが修正されます.通常、ON DUPLICATE KEY UPDATE文では、複数の一意インデックスの場合は避けるべきです.複数のデータを挿入または更新したい場合、更新されたフィールドは他のフィールドに基づいて演算したい場合、次のような文が使用されます.
[sql]view plincopyコードシートの派生をコードシートで確認します.
INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
ON DUPLICATE KEY UPDATEの後にVALES()の方法を使用すると、この文は次の2つの文と同じです.
[sql]view plincopyコードシートの派生をコードシートで確認します.
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=3;--1+2
INSERT INTO table (a,b,c) VALUES (4,5,6)
ON DUPLICATE KEY UPDATE c=9;--4+5
一つの表にatotが含まれている場合incrementのフィールドは、毎回insertデータの後、last_を通過することができます.insert_ID()メソッドは最後に自動的に生成された値を返します.INSERT...ON DUPLICATE KEY UDATE文でデータを修正したら、またlast_を通過します.insert_ID()メソッドで取得した値は正しくないです.実際のテストでは、表に3つのデータを追加した場合、last_を通過します.insert_ID()メソッドで得られた値は3ですが、この文でデータを修正した後、ラスボス(u)を通過します.insert_id()法で得られた値は4です.この問題を解決したいなら、次のような文を使ってもいいです.
[sql]view plincopyコードシートの派生をコードシートで確認します.
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;
ポイントはこのid=LAST_です.INSERT_ID(id)です英語の原文:
https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
本文は高爽𞓜Coderから来ました.原文の住所:
http://blog.csdn.net/ghsau/article/details/23557915、転載は明記してください.