2016-10-15 2 views
1

Ich benutze mysqli_insert_id(), um die letzte automatische Inkrement-ID auf einer Tabelle zu erhalten, aber es gibt immer '0' zurück.mysqli_insert_id auf zusammengesetzte Abfrage

$sql = "INSERT INTO inventory (SELECT * FROM tmptable)"; 
$result = mysqli_query($link, $sql); 
$newId = mysqli_insert_id($link); //$newID ends up being 0 

Die id Spalte der Tabelle inventory auf Autoinkrement gesetzt ist, und mysqli_insert_id() funktioniert auf anderen INSERT Anfragen an inventory, die nicht sind das Ergebnis einer SELECT Anweisung einfügen. Wird die SELECT-Anweisung aus irgendeinem Grund als letzte Abfrage Vorrang haben, was dazu führen würde, dass mysqli_insert_id() 0 zurückgibt?

Antwort

2

Sie verwenden LAST_INSERT_ID() falsch. http://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_last-insert-id Es ist die Serverfunktion, die mysqli_insert_id() zugrunde liegt.

Zunächst erwähnt Ihre INSERT-Anweisung keine Liste von Spaltennamen. Das bedeutet, dass Informationen in alle Spalten der Zieltabelle eingefügt werden, einschließlich der Autoinkrementierungsspalte. Wenn Sie den Wert der Autoinkrementierungsspalte in Ihrem INSERT angeben, deaktivieren Sie die Autoinkrementierungsfunktion, so dass Sie Null statt eines tatsächlichen id-Werts von LAST_INSERT_ID() erhalten.

Zweitens, wenn Sie mehr als eine Zeile einfügen, erhalten Sie nur den ID-Wert der ersten Zeile eingefügt.

+0

Das war die richtige Antwort in meinem Fall. Ich habe aufgehört zu versuchen, so clever zu sein und habe das Ergebnis der SELECT-Anweisung im voraus erhalten, habe seine Felder in Variablen gespeichert und eine normale INSERT-Operation ausgeführt. Zu diesem Zeitpunkt funktionierte mysqli_insert_id wie erwartet. –

1

Hinweis: Diese Antwort beinhaltet Tabelle sperren so in stark frequentierten Websites kann es die Leistung verschlechtern (unter der Annahme, dass Ihre Spalte Autoinkrement ist "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"); 
Verwandte Themen