Это то, как обычный человек решил бы это в реальном мире, с частями кода. Благодаря автоинкременту он должен получить минимально возможное количество записей для проверки, поэтому они не будут занимать много времени. Это не окончательный код "скопировать и вставить", например. Вы должны создать свою собственную функцию compare_content () в соответствии с вашими потребностями.

я вставляю несколько записей с циклом, который выполняет вставку одной записи, последний возвращенный идентификатор вставки, как и ожидалось, является последней. Но если я сделаю несколько записей, вставьте оператор:

INSERT INTO people (name,age)
VALUES ('William',25), ('Bart',15), ('Mary',12);

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

Так может кто-то, пожалуйста, подтвердите, если это нормальное поведениеLAST_INSERT_ID() в контексте нескольких записей операторов INSERT. Поэтому я могу основывать свой код на этом.

 Timo Huovinen30 окт. 2013 г., 14:28
@FriendlyDev Да, вы правы, спасибо за разъяснения. Также другое примечание: дляINSERT IGNORE или жеINSERT ... ON DUPLICATE KEY UPDATE MySQL не знает количество строк, которые будут вставлены, поэтому он будет увеличиваться и резервировать один идентификатор autoinc для каждой возможной вставки в InnoDB. Хотя я не уверен, что назначенные идентификаторы и пробелы находятся в том же порядке, что и строки вVALUES в этом случае.
 Timo Huovinen19 окт. 2013 г., 20:15
@dqhendricks вы уверены, что идентификаторы будут правильными? насколько мне известно, вставки с помощью innodb не блокируют определенный набор идентификаторов, и другой процесс может вставить запись между ними, хотя я не уверен в этом для нескольких значений вINSERT ... VALUES ...
 Pekka 웃09 янв. 2011 г., 03:44
Есть ли у вашей таблицы auto-incrementID?
 OCDev30 окт. 2013 г., 13:52
@TimoHuovinen - я согласен и понимаю проблему. Однако я уверен, что если все 3 вставки выполняются в одном и том же операторе вставки, это происходит внутри одной и той же транзакции и поэтому исключает все другие вставки из других транзакций во время их вставки. Таким образом, вставки в пределах одного и того же оператора всегда будут следовать непосредственно друг за другом, и вы можете смело полагаться на численное увеличение последнего идентификатора вставки, чтобы получить идентификаторы для последующих.
 dqhendricks09 янв. 2011 г., 04:42
вторые два идентификатора вставки легко вычисляются. просто добавьте одну для каждой записи после первой.

Ответы на вопрос(3)

что это возможно, если ваша таблица имеет уникальный столбец автоинкремента (ID), и вы не требуете, чтобы они возвращались самой MySQL. Я бы обошелся вам еще в 3 запроса к БД и некоторой обработке. Это потребовало бы этих шагов:

Получите «До MAX (ID)» прямо перед вашей вставкой:
    SELECT MAX(id) AS before_max_id FROM table_name`

Сделайте несколько запросов INSERT ... VALUES () со своими данными и сохраните их:

INSERT INTO table_name
(col1, col2)
VALUES 
("value1-1" , "value1-2"), 
("value2-1" , "value2-2"), 
("value3-1" , "value3-2"), 
ON DUPLICATE KEY UPDATE

Получите «После MAX (ID)» сразу после вставки:

SELECT MAX(id) AS after_max_id FROM table_name`

Получить записи с идентификаторами между «До MAX (ID)» и «После MAX (ID)», включая:

SELECT * FROM table_name WHERE id>$before_max_id AND id<=$after_max_id`

Проверьте полученные данные на соответствие введенным данным и удалите все записи, которые не были добавлены вами. Остальные записи имеют ваши идентификаторы:

    foreach ($after_collection as $after_item) {
      foreach ($input_collection as $input_item) {
        if ( $after_item->compare_content($input_item) ) {
          $intersection_array[] = $after_item;
        }
      }
    }

Это то, как обычный человек решил бы это в реальном мире, с частями кода. Благодаря автоинкременту он должен получить минимально возможное количество записей для проверки, поэтому они не будут занимать много времени. Это не окончательный код "скопировать и вставить", например. Вы должны создать свою собственную функцию compare_content () в соответствии с вашими потребностями.

справочная страница для MySQL. Это в комментариях, но не оспаривается, поэтому я предполагаю, что это ожидаемое поведение.

 Asaph31 окт. 2011 г., 22:01
К вашему сведению: это поведение описано в настоящем руководстве по MySQL, а не только в комментариях пользователей. Видетьмой ответ для деталей.
Решение Вопроса

last_insert_id() являетсязадокументировано в документации по MySQL:

Важный
Если вы вставляете несколько строк, используя одинINSERT заявление,LAST_INSERT_ID() возвращает значение, сгенерированное только для первой вставленной строки. Причина этого в том, чтобы можно было легко воспроизводить одно и то жеINSERT заявление против какого-то другого сервера.

Ваш ответ на вопрос