0

INSERT INTO ON DUPLICATE KEY UPDATE のために PHP で mysqli::insert_id を使用すると、行が更新されると、更新された行ではなく、次の自動インクリメントを取得し続けます。同じデータベースの別のテーブルでは、ON DUPLICATE KEY UPDATE を使用すると、この動作は発生しません。代わりに、更新された行の ID を取得します。しかし、何らかの理由で、作成した新しいテーブルで、存在しない次の ID を取得し続けています。どちらのテーブルも MyISAM で、自動インクリメント フィールドがあります。なぜ彼らが異なる振る舞いをするのか理解できません。

例:

==================================
Table: example
==================================
id  |   unique_field    |   data
==================================
1   |   unique1         |   123
2   |   unique2         |   456

INSERT INTO
    example
SET
    unique_field = 'unique1',
    data = '321'
ON DUPLICATE KEY UPDATE
    data = '321'


// mysqli::insert_id returns 3 (not 1)!!

何か案は?

4

1 に答える 1

1

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; ON DUPLICATE KEY UPDATE を使用する場合、DELAYED オプションは無視されます。

それが役立つことを願っています。

于 2011-09-14T13:54:19.920 に答える