2011-09-14 10 views
0

PHPでINSERT INTO ON DUPLICATE KEY UPDATEにmysqli :: insert_idを使用しているとき、更新された行が更新されていれば、次の自動インクリメントを取得し続けます。同じデータベースではあるが他のテーブルでは、重複キー更新を使用しているときにこの動作がありません。代わりに、私は更新された行のIDを取得します。しかし、今私が作成した新しいテーブルで何らかの理由で、私は存在しない次のIDを取得し続けます。どちらのテーブルもMyISAMで、自動増分フィールドを持っています。彼らがなぜ違うのか理解できません。mysqli :: insert_idが重複キーで間違ったIDを返す

例:

================================== 
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)!! 

任意のアイデア? mysql manualから

答えて

1

テーブルは、行を挿入 AUTO_INCREMENTカラムおよびINSERT ... UPDATEが含まれている場合、LAST_INSERT_ID()関数は AUTO_INCREMENT値を返します。ステートメントが行を代わりに更新する場合、 LAST_INSERT_ID()は意味を持ちません。ただし、 を回避するには、LAST_INSERT_ID(expr)を使用します。 idがAUTO_INCREMENT の列であるとします。更新のLAST_INSERT_ID()は有意義なもの、次のように行 を挿入する:DUPLICATE KEY UPDATE ID = LAST_INSERT_ID(ID)にテーブルに

INSERT(A、B、C)の値(1,2,3)、C = 3; ON DUPLICATE KEY UPDATEを使用すると、DELAYEDオプションは無視されます。

希望するものがあります。

+0

実際に私が望んでいた結果が得られます。しかし、なぜ私は私が言及した他のテーブルのためにこれを行う必要はありません理解していない。 – quano

+0

例とテーブル構造の両方を投稿できますか? –

+0

申し訳ありませんができません。しかし、もう少し試してみましたが、クエリのUPDATE側のどこかにNOW()を使用すると、IDは更新された行と同じになることに気付きました。とても奇妙です。基本的には、呼び出される関数の点で2つのテーブルが異なるのです - 私はinsert-updateクエリの1つでNOW()を使用し、他のクエリでは使用しません。 – quano

関連する問題