Надежен ли метод последней вставки - PullRequest
0 голосов
/ 10 октября 2018

Следующий сценарий.

У нас есть 2 сценария, оба для вставки в таблицу и последующего использования lastInsertId() для получения значения из столбца автоинкремента.

Если эти 2 сценария выполняются впараллельно, мы точно знаем, что они не испортят результаты?


В режиме реального времени:

Время 1: сценарий 1 -> Вставить.(создан id = 1)

Время 1: сценарий 2 -> Вставить.(создан id = 2)

(база данных обрабатывает это, используя, вероятно, блокировки / семафоры)

Q1. Время 2: сценарий 2 -> lastInsertId() возвращает 1 или 2?Это детерминированный?

Q2. А как насчет последовательных вставок?

script.php

$statement1->insert('john'); // id = 1
$statement2->insert('mary'); // id = 2

echo $statement1->lastInsertId();
// is it 1 or 2? Is this also deterministic? 

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Да, это надежно.

lastInsertId(), как следует из названия, удерживает id (первичный ключ) последней вставленной строки.

Так что в отношении Q1: ответ будет 2, поскольку это была последняя вставленная строка.

Когда речь идет о последовательных вставках, и вы хотите "сделать что-то", который вращается вокруг использования lastInsertId(), тогда вам придется объявить lastInsertId() EXACTLY после (это важно) строки выполненного запроса.Таким образом, вы обязательно сохраните id , который хотите использовать.

->an insert query is executed
->lastInsertId() is stored into a variable
->variable is used for something
->another insert query is executed
->another lastInsertId is stored into a variable
->variable is used for something.
etc...

та же логика применима к циклу.

У вас не обязательно естьхранить lastInsertId() в переменной, но это имеет смысл, если вы работаете в PHP и хотите использовать его для нескольких целей.Если нет, то вы можете просто использовать его непосредственно в соответствующем запросе.Но помните, это должно быть точно после указанной вставки для id , который вы хотите использовать.

Пример сбойной логики:

<?php
//I want to get id 1
$statement1->insert('john'); // id = 1
$statement2->insert('mary'); // id = 2
$lastId=$statement1->lastInsertId();
?>

Это будет неудачная логика, потому что я собираюсь получить идентификатор 1, но так как я жду, чтобы получить мой lastInsertId() после оператора 2, а не оператора 1, мой lastInsertId() будет равен 2 вместо 1.

Рабочая логика:

<?php
//I want to get id 1
$statement1->insert('john'); // id = 1
$lastId=$statement1->lastInsertId();
//do something with $lastId? (value will be 1)
//get contact info from a theoretical contact info table
$sql="SELECT * FROM tbl_contacts WHERE userId='$lastId'";
$statement2->insert('mary'); // id = 2
$lastId=$statement2->lastInsertId();
//do something with $lastId? (value will be 2)
?>

Эта логика будет работать, потому что я получаю нужные мне значения (значения) id и использую их доони перезаписываются другим id .

Вы, конечно, можете сделать переменные, содержащие значение lastInsertId(), уникальными, чтобы они не перезаписывались, и затем вы могли бы использовать ихв любое время.

0 голосов
/ 10 октября 2018

Да, это надежно.

Если вы думаете, что таблица будет иметь сотни или тысячи вставок в секунду, подумайте, не используйте индексы или используйте минимальное количество индексов.В случае MySQL предпочитайте таблицы MyISAM.

В вашем случае

Q1. Время 2: Script 2 -> lastInsertId () возвращает 1 или 2?Является ли это детерминированным?

возвращает идентификатор 2-го запроса.

Q2. Как насчет последовательных вставок?

вы должны обязательно задать lastInsertIdсразу после запроса на вставку.

Надеюсь, это поможет вам.

...