この動作は
ON DUPLICATE KEY UPDATEを指定し、UNIQUEインデックスまたはPRIMARY KEYに重複値を引き起こす行が挿入された場合、MySQLは古い行の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;
(aが自動インクリメント列であるInnoDBテーブルの場合、効果は同じではありません。自動インクリメント列を使用すると、INSERTステートメントは自動インクリメント値を増やしますが、UPDATEは増やしません。)
ここに簡単な説明があります。 MySQLは最初に挿入を試みます。これは、IDが自動的にインクリメントされるときです。インクリメントされると、そのままになります。次に、重複が検出され、更新が行われます。しかし、その価値は失われます。
auto_increment
に依存しないでください ギャップはありません。それが要件である場合、更新と挿入のオーバーヘッドははるかに大きくなります。基本的に、テーブル全体をロックし、通常はトリガーを使用して、番号を付け直す必要があるすべての番号を付け直す必要があります。より良い解決策は、出力の増分値を計算することです。