Как я могу обрабатывать одновременные вставки в MySQL таблице и получить правильный идентификатор вставки - PullRequest
3 голосов
/ 23 января 2010

Я использую adodb для библиотеки PHP.

Для извлечения идентификатора, по которому вставлена ​​запись, я использую эту функцию

"$db->Insert_ID()"

Я хочу знать, есть ли несколько одновременных вставок в таблицу базы данных, будет ли этот метод возвращать мне правильный вставленный идентификатор для каждой вставленной записи?

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

Достаточно ли безопасен этот подход или я что-то упустил?

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

Спасибо

Ответы [ 3 ]

10 голосов
/ 23 января 2010

Да, это безопасно для одновременного использования. Это потому, что LAST_INSERT_ID() для каждого соединения, как объяснено здесь :

Сгенерированный идентификатор поддерживается на сервере на на основе подключения. Это означает, что значение, возвращаемое функцией данный клиент является первым Значение AUTO_INCREMENT, сгенерированное для последнее заявление, затрагивающее Столбец AUTO_INCREMENT этим клиентом. Это значение не может зависеть от других клиенты, даже если они генерируют Значения AUTO_INCREMENT свои. Такое поведение гарантирует, что каждый клиент может получить свой собственный идентификатор без забота о деятельности других клиенты, и без необходимости блокировки или транзакции.

1 голос
/ 23 января 2010

Я хочу знать, есть ли несколько одновременных вставок в таблицу базы данных, будет ли этот метод возвращать мне правильный вставленный идентификатор для каждой вставленной записи?

Он вернет только последний вставленный идентификатор.
Чтобы получить идентификаторы для нескольких вставок, вам нужно будет вызывать INSERT_ID() после выполнения каждого оператора. IE:

INSERT INTO TABLE ....
INSERT_ID()

INSERT INTO TABLE ....
INSERT_ID()

... чтобы получить значение идентификатора для каждой вставки. Если вы бежали:

INSERT INTO TABLE ....
INSERT INTO TABLE ....
INSERT_ID()

... вернет идентификатор только для последнего оператора вставки.

Достаточно ли безопасен этот подход или я что-то упустил?

Это безопаснее, чем использовать SELECT MAX(id) FROM TABLE, что может привести к возврату значения, вставленного кем-то другим, среди прочего, связанного с уровнями изоляции.

1 голос
/ 23 января 2010

$ db-> Insert_ID () вернет вам только последний идентификатор вставки, так что если вы вставляете много записей и хотите получить идентификатор каждой последней вставленной строки, то это будет работать успешно.

...