Насколько эффективен Last_insert_id?

Недавно я столкнулся с проблемой, когда мне нужно было получить последний идентификатор запроса, который я вставил на страницу. Процесс был довольно прост, но я хотел бы получить некоторое подтверждение того, как этот процесс выполняется. Вот как мой код:

$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 последнюю строку, вставленную в базу данных, или последнюю строку, вставленную в базу данных на странице? Теперь я не совсем уверен в механике, стоящей за этим, но я спрашиваю об этом, потому что, что, если человек должен был загрузить эту страницу в то же самое время, что и другой человек? Будут ли непревзойденные идентификаторы или код все еще будет работать?

9

Решение

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)

8

Другие решения

Другие отметили, что 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, когда вы используете его таким образом.

6

Некоторые библиотеки могут получить last-insert-id автоматически, независимо от того, спрашиваете вы их или нет, в этом случае вызов всегда безопасен (так как нет дополнительного запроса к базе данных).

В противном случае он возвращает последний идентификатор соединения. Если соединение является общим, то лучше всего обернуть его в транзакцию.

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector