При вставке данных в таблицу с автоматически увеличивающимся PK мне нужно получить этот ключ для использования в другом выражении. Как многие вопросы показывают на SO, это можно сделать в PHP с помощью mysql_insert_id()
.
Тем не менее, я группировал свои вставки вместе, поэтому я вставляю несколько строк за раз. Я сделал это, поскольку я догадался, что, вероятно, будет какая-то проблема с производительностью, пожалуйста, сообщите, если я ошибаюсь. В любом случае, насколько мне известно, mysql_insert_id()
возвращает только последний id, когда мне нужны идентификаторы для всех вставленных строк.
Думаю, в этом случае я мог:
Сделайте некоторые простые математические вычисления для вычисления всех идентификаторов с помощью mysql_insert_id()
и количества введенных строк. Но гарантируется ли это неизменно правильно?
Используйте несколько операторов вставки, по одному для каждой строки
Создайте мои идентификаторы до и не используйте автоматическое увеличение.
Я уверен, что это должна быть классическая проблема, поэтому мне интересно, какие наиболее распространенные и целесообразные подходы.
Вызов 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
и поместить новые идентификаторы в небольшую таблицу аудита. Однако утрируйте таблицу, прежде чем проверять эти идентификаторы. Я бы использовал этот метод, если ваша таблица составляет миллионы и миллионы строк.