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

Я использую MySQL 5.5 с PHP 5.4. Я выполняю массовую вставку и мне нужно захватить все вновь вставленные идентификаторы. Это мой код:

$db->query("INSERT INTO commodity (analysis_id, commodity_description, a_units, 
a_average_yield, a_average_price) SELECT $analysis_id, commodity_description, 
a_units, a_average_yield, a_average_price FROM commodity WHERE analysis_id = 
$import_analysis_id");

Есть ли способ получить все новые идентификаторы вставленных строк? Использование $db->insert_id возвращает только один идентификатор. Я бы не хотел использовать цикл PHP и выполнять несколько запросов, но я это сделаю, если придется. Спасибо!


person Jeff    schedule 18.07.2012    source источник
comment
Невозможно (неизвестное решение, я знаю). Не могли бы вы опубликовать пример того, для чего вам нужны идентификаторы? Может быть, мы могли бы найти другой способ заархивировать вашу цель...   -  person Ron    schedule 18.07.2012
comment
У вас есть дата и время в вашей таблице? если да, то вы можете написать простой запрос, чтобы получить все вставленные идентификаторы после определенной отметки времени.   -  person metalfight - user868766    schedule 18.07.2012
comment
Каково имя поля идентификатора, который вы хотите? Я предполагаю, что это не analysis_id. Может ли это быть product_id или просто идентификатор?   -  person ghbarratt    schedule 18.07.2012


Ответы (2)


Вы можете найти автоматически увеличивающиеся ids, сначала выбрав самый высокий идентификатор в своей таблице. ids выше, чем новые после вставки.

select max(id) from commodity 
person juergen d    schedule 18.07.2012
comment
С этим решением рассмотрите возможность использования LOCK TABLES, чтобы другие сеансы не вставлялись в ту же таблицу, искажая ваши данные. - person Marcus Adams; 18.07.2012
comment
Использование LOCK TABLES — действительно хорошая идея. Но это замедляет процесс, так как только один процесс может делать это одновременно. - person Ron; 18.07.2012
comment
Я думаю, что Юрген прав. Для InnoDB вы можете использовать транзакцию (с Repeatable Read), которая позволит одновременно использовать таблицу. - person Marcus Adams; 18.07.2012

Думаю, я слишком много думал об этом. Поскольку я вставляю analysis_id (например, номер дела, номер клиента и т. д.), я решил просто запустить после этого запрос, который извлечет все идентификаторы для вставленного analysis_id. Это решило мою проблему.

person Jeff    schedule 18.07.2012
comment
Прохладный. Значит, analysis_id индексируется? - person Marcus Adams; 18.07.2012