プライマリキーが衝突した場合は更新しないと挿入(ON DUPLICATE KEY UPDATE)

2186 ワード

mysql"ON DUPLICATE KEY UPDATE"構文INSERT文の末尾にON DUPLICATE KEY UPDATEが指定され、行を挿入するとUNIQEインデックスまたはPRIMARY KEYに重複値が表示され、重複値が表示された行でUPDATEが実行されます.一意の値列が重複する問題が発生しない場合は、新しい行を挿入します.たとえば、カラムaがプライマリ・キーまたはUNIQUEインデックスを持ち、値1が含まれている場合、次の2つの文は同じ効果を有します.
 
   
INSERT INTO TABLE (a,c) VALUES (1,3) ON DUPLICATE KEY UPDATE c=c+1;
UPDATE TABLE SET c=c+1 WHERE a=1;

行が新しいレコードとして挿入されると、影響を受ける行の値は1を表示します.既存のレコードが更新されると、影響を受ける行の値は2を表示します.この構文は、INSERTマルチローレコード(aがプライマリ・キーまたはaがUNIQUEインデックス・カラムであると仮定する):
 
   
INSERT INTO TABLE (a,c) VALUES (1,3),(1,7) ON DUPLICATE KEY UPDATE c=c+1;

実行後、cの値は4になる(第2条は第1条と重複し、cは元の値に+1).
 
   
INSERT INTO TABLE (a,c) VALUES (1,3),(1,7) ON DUPLICATE KEY UPDATE c=VALUES(c);

実行後、cの値は7になる(第2条は第1条と重複し、cは直接重複する値7をとる).注意:ON DUPLICATE KEY UPDATEはMySQL特有の文法であり、SQL標準文法ではありません.この文法とは、記録が存在するか否かを判断する必要がある、存在しない場合は存在を挿入する更新するシーンに用いる.INSERT INTO .. ON DUPLICATE KEY更新複数行レコードINSERT文の末尾にON DUPLICATE KEY UPDATEが指定され、行を挿入するとUNIQEインデックスまたはPRIMARY KEYに重複値が現れる場合、古い行UPDATEを実行します.一意の値列が重複する問題が発生しない場合は、新しい行を挿入します.たとえば、カラムaがUNIQUEとして定義され、値1が含まれている場合、次の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;

行が新しいレコードとして挿入されると、影響を受ける行の値は1になります.既存のレコードが更新されると、影響を受けるローの値は2になります.INSERT INTOについてもっと知りたいならON DUPLICATE KEYの機能説明、詳しくはMySQL参考文書:13.2.4.INSERTの文法は今問題が来て、もしINSERTの複数行の記録ならば、ON DUPLICATE KEY UPDATEの後ろのフィールドの値はどのように指定しますか?1つのINSERT文に1つのON DUPLICATE KEY UPDATEしかないことを知っておくと、彼は1行の記録を更新するのか、それとも更新する必要があるすべての行を更新するのか.この問題は長い間困っていたが,実はVALES()関数を使ってすべての問題が解決した.たとえば、フィールドaはUNIQUEとして定義され、元のデータベーステーブルtableには既にレコード(2,2,9)と(3,2,1)が存在し、挿入レコードのa値が元のレコードと重複する場合、元のレコードが更新され、そうでない場合、新しい行が挿入される.
 
   
INSERT INTO TABLE (a,b,c) VALUES
(1,2,3),
(2,5,7),
(3,3,6),
(4,8,2)
ON DUPLICATE KEY UPDATE b=VALUES(b);

以上のSQL文の実行により、(2,5,7)のaが既存レコード(2,2,9)と一意の値衝突していることを発見した場合、ON DUPLICATE KEY UPDATEを実行し、既存レコード(2,2,9)を(2,5,9)に更新し、(3,2,1)を(3,3,1)に更新し、新規レコード(1,2,3)と(4,8,2)を挿入する