148

次のクエリがあります。

INSERT INTO table (a) VALUES (0)
  ON DUPLICATE KEY UPDATE a=1

挿入または更新の ID が必要です。通常、insert_id() は「挿入された」ID のみを返し、更新された ID は返さないと考えているため、これを取得するために 2 番目のクエリを実行します。

2 つのクエリを実行せずに行の ID を INSERT/UPDATE して取得する方法はありますか?

4

7 に答える 7

197

このページをチェックしてください: https://web.archive.org/web/20150329004325/https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
ページ の下部それらは、その MySQL 関数に式を渡すことによって、LAST_INSERT_ID を更新のために意味のあるものにする方法を説明しています。

MySQL ドキュメントの例から:

テーブルに AUTO_INCREMENT 列が含まれていて、INSERT ... UPDATE が行を挿入する場合、LAST_INSERT_ID() 関数は AUTO_INCREMENT 値を返します。代わりにステートメントが行を更新する場合、LAST_INSERT_ID() は意味がありません。ただし、LAST_INSERT_ID(expr) を使用してこれを回避できます。id が AUTO_INCREMENT 列であるとします。LAST_INSERT_ID() を更新に意味のあるものにするには、次のように行を挿入します。

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;
于 2009-04-22T21:13:10.593 に答える
39

正確には、これが元のクエリである場合:

INSERT INTO table (a) VALUES (0)
 ON DUPLICATE KEY UPDATE a=1

'id'は、これが機能するソリューションであるよりも自動インクリメントの主キーです。

INSERT INTO table (a) VALUES (0)
  ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), a=1

すべてここにあります:http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

テーブルにAUTO_INCREMENT列が含まれていて、INSERT ... UPDATEが行を挿入する場合、LAST_INSERT_ID()関数はAUTO_INCREMENT値を返します。ステートメントが代わりに行を更新する場合、LAST_INSERT_ID()は意味がありません。ただし、LAST_INSERT_ID(expr)を使用してこれを回避できます。idがAUTO_INCREMENT列であるとします。

于 2012-08-10T19:11:54.170 に答える
2

MySQL のバージョンはわかりませんが、InnoDB では、autoinc にバグがありました。

5.1.20 のバグ、5.1.23 で修正 http://bugs.mysql.com/bug.php?id=27405

5.1.31 のバグ、5.1.33 で修正 http://bugs.mysql.com/bug.php?id=42714

于 2009-04-22T21:02:49.540 に答える
2

レコードが存在する場合、基本的に削除/挿入である REPLACE を見ることができます。ただし、これにより自動インクリメント フィールドが存在する場合は変更され、他のデータとの関係が壊れる可能性があります。

于 2009-04-22T18:40:41.957 に答える
0

注目に値することであり、これは明らかかもしれませんが (ただし、ここでは明確にするためにとにかく言います)、REPLACE は新しいデータを挿入する前に既存の一致する行を吹き飛ばします。ON DUPLICATE KEY UPDATE は、指定した列のみを更新し、行を保持します。

マニュアルから:

REPLACE は INSERT とまったく同じように機能しますが、テーブル内の古い行が PRIMARY KEY または UNIQUE インデックスの新しい行と同じ値を持つ場合、新しい行が挿入される前に古い行が削除される点が異なります。

于 2009-11-05T15:03:58.383 に答える