Недавно я столкнулся с проблемой, когда мне нужно было получить последний идентификатор запроса, который я вставил на страницу. Процесс был довольно прост, но я хотел бы получить некоторое подтверждение того, как этот процесс выполняется. Вот как мой код:
$query30 = $db->query("INSERT `mybb_quickexample` SET `player1` = '".$row19[username]."', `player2` = '".$row18[username]."', `games` = '".$numberofgames."'")or die( mysqli_error());
Как вы можете видеть, я только что что-то вставил в mybb_quickexample, который затем генерирует ID. Теперь в коде прямо под ним, я пытаюсь найти идентификатор.
$mmid = $db->insert_id();
foreach($_POST['optiontitle'] as $val){
$val = $db->escape_string($val); //
echo $val;
$query30 = $db->query("INSERT `mybb_quickexample2` SET `gid` = '".$id."', `mid` = '".$mmid."', `optiontitle` = 'OPTION TITLE', `option1` = '$val'")or die( mysqli_error());
}
Как видите, он захватывает последний идентификатор и помещает его в новую таблицу. Позволяя этим двум таблицам соответствовать друг другу позже, когда они мне понадобятся.
Однако захватывает ли insert_last_id последнюю строку, вставленную в базу данных, или последнюю строку, вставленную в базу данных на странице? Теперь я не совсем уверен в механике, стоящей за этим, но я спрашиваю об этом, потому что, что, если человек должен был загрузить эту страницу в то же самое время, что и другой человек? Будут ли непревзойденные идентификаторы или код все еще будет работать?
insert_last_id
возвращает последний вставленный идентификатор того же сеанса / соединения SQL (см. Руководство по MySQL). — SQL-сервер не знает о ваших страницах. Пока соединение / сеанс не являются общими, проблем не возникает (например, условия гонки).
Также возможно получить последний вставленный идентификатор, используя только SQL: select LAST_INSERT_ID();
или используйте его непосредственно в следующем запросе SQL, чтобы уменьшить количество обращений к клиент-серверу, таких как insert table B set foreign_id=LAST_INSERT_ID(),data="something";
(обратите внимание, однако, если следующий оператор SQL также имеет столбец автоинкремента, следующий LAST_INSERT_ID()
вызов вернет новейший вставленный идентификатор; увидеть Руководство по MySQL)
Другие отметили, что LAST_INSERT_ID поддерживается для каждого соединения MySQL. Он фиксирует фактический идентификатор, использованный в самой последней вставке, со значением автоинкремента в вашем соединении. То есть он делает правильные вещи, даже если другие соединения также выполняют много вставок. (Это может быть правдой на загруженном веб-сайте, обслуживающем одновременно нескольких пользователей.)
Если вам нужно использовать его во вставке, вы можете сделать это напрямую, без каких-либо поездок туда и обратно к клиенту. Например, вот два запроса, которые вы можете выполнить один за другим из вашей программы
INSERT INTO person (first, last)
VALUES ('Jack', 'Straw');
INSET INTO address (person_id, addr, town)
VALUES (LAST_INSERT_ID(),'10 Downing St', 'London');
Видишь, как это работает? Вы можете использовать его для предоставления значения в списке значений вставки. Это одна из самых простых и эффективных вещей в MySQL, когда вы используете его таким образом.
Некоторые библиотеки могут получить last-insert-id
автоматически, независимо от того, спрашиваете вы их или нет, в этом случае вызов всегда безопасен (так как нет дополнительного запроса к базе данных).
В противном случае он возвращает последний идентификатор соединения. Если соединение является общим, то лучше всего обернуть его в транзакцию.