Подтвердить что ты не робот

Получение последних вставленных идентификаторов для нескольких строк

При вставке данных в таблицу с автоматически увеличивающимся PK мне нужно получить этот ключ для использования в другом выражении. Как многие вопросы показывают на SO, это можно сделать в PHP с помощью mysql_insert_id().

Однако я группировал свои вставки вместе, поэтому я вставляю несколько строк за раз. Я сделал это, поскольку я догадался, что, вероятно, будет какая-то проблема с производительностью, пожалуйста, сообщите, если я ошибаюсь. В любом случае, насколько мне известно, mysql_insert_id() возвращает только последний id, когда мне нужны идентификаторы для всех вставленных строк.

Думаю, в этом случае я мог:

  • Сделайте некоторые простые математические вычисления для вычисления всех идентификаторов с помощью mysql_insert_id() и количества введенных строк. Но гарантируется ли это, что это правильно?

  • Используйте несколько операторов вставки, по одному для каждой строки

  • Создайте мои идентификаторы до и не используйте автоматическое увеличение.

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

4b9b3361

Ответ 1

Вызов last_insert_id() дает вам идентификатор строки FIRST, вставленной в последнюю партию. Все остальные вставлены, гарантированно будут последовательными.

Если вы делаете что-то очень странное, это позволяет достаточно легко вычислить идентификатор каждой строки.

На самом деле поведение изменяется в 5.1 в зависимости от настройки параметра режима инкремента автоматического индосса; это не имеет значения. Если вы не измените его по умолчанию, вы увидите ожидаемое поведение.

Есть случайные случаи, когда это не делает то, что вы ожидаете, и не полезно - например, если вы выполняете ОБНОВЛЕНИЕ КЛЮЧЕЙ DUPLICATE KEY UPDATE или INSERT IGNORE. В этих случаях вам нужно будет сделать что-то еще, чтобы выработать идентификаторы каждой строки.

Но для простой партии ванили INSERT без значений, указанных для столбца auto-inc, легко.

Полное описание того, как автоматические приращения обрабатываются в innodb, здесь

Ответ 2

Есть несколько подходов, которые я бы использовал, если бы я был мной:

Во-первых, есть поле CreateDate со стандартным методом CURRENT_TIMESTAMP. Вы по существу выбираете CURRENT_TIMESTAMP, чтобы получить дату, запустите вставку, а затем select id from table where CreateDate > $mytimestamp.

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