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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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