2016-10-15 10 views
1

私はmysqli_insert_id()を使用してテーブルの最後の自動インクリメントIDを取得しますが、常に '0'を返します。複合クエリのmysqli_insert_id

$sql = "INSERT INTO inventory (SELECT * FROM tmptable)"; 
$result = mysqli_query($link, $sql); 
$newId = mysqli_insert_id($link); //$newID ends up being 0 
inventoryテーブルの id列が自動インクリメントに設定されている

、およびmysqli_insert_id()SELECT文の結果を挿入していないinventoryに他のINSERTのクエリで正常に動作します。何らかの理由でSELECTステートメントが最後のクエリとして優先されていますか?mysqli_insert_id()は0を返しますか?

答えて

2

あなたはLAST_INSERT_ID()を間違って使用しています。 http://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_last-insert-idサーバの機能は、mysqli_insert_id()です。

まず、INSERTステートメントには列名のリストはありません。つまり、自動インクリメントの列を含め、ターゲット表のすべての列に情報を挿入しています。 INSERTで自動インクリメント列の値を指定すると、自動インクリメント機能が無効になりますので、実際のid値の代わりにゼロ復帰します(LAST_INSERT_ID())。

第2に、複数の行を挿入すると、挿入された最初の行のid値だけが取得されます。

+0

これは私の場合の正解でした。私はとても巧みにしようとしなくなり、SELECTステートメントの結果をあらかじめ得て、変数をフィールドに保存して通常のINSERTを行った。その時点で、mysqli_insert_idは期待どおりに動作しました。 –

1

注:この回答ではテーブルロックが含まれているため、トラフィックが多いWebサイトではパフォーマンスが低下する可能性があります(自動インクリメント列が「id」の場合)。

mysqli_query($link, "LOCK TABLE inventory WRITE,tmptable READ"); 
mysqli_query($link, "INSERT INTO inventory (SELECT * FROM tmptable)"); 
$r = mysqli_query($link, "SELECT MAX(id) FROM inventory"); 
mysqli_query($link, "UNLOCK TABLES");