2016-10-15 2 views
1

Я использую mysqli_insert_id(), чтобы получить последний идентификатор автоматического увеличения в таблице, но он всегда возвращает '0'.mysqli_insert_id on составной запрос

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

id столбец inventory таблицы установлен автоматический инкремент и mysqli_insert_id() отлично работает на других INSERT запросов к inventory, не вставляя результат SELECT заявления. Является ли заявление SELECT приоритетом в качестве последнего запроса по какой-либо причине, что приведет к возврату mysqli_insert_id()?

ответ

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().

Во-вторых, если вы вставляете несколько строк, вы получите только значение id первой вставленной строки.

+0

Это был правильный ответ в моем случае. Я перестал стараться быть таким умным и получить результат инструкции SELECT заранее, сохранил его поля для переменных и сделал обычный INSERT. В этот момент mysqli_insert_id работал так, как ожидалось. –

1

Примечание: Этот ответ включает в себя блокировку таблицы, поэтому на сайтах с интенсивным трафиком это может ухудшить производительность (при условии, что ваш столбец автоматического увеличения равен «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"); 
Смежные вопросы