MySQL – вернуть группу последних вставленных идентификаторов

Итак, есть много вопросов и ответов о LAST_INSERT_ID(). Это прекрасно работает, если вы вставляете одну строку и вам нужно возвращаемое значение этого идентификатора, но что, если вы делаете групповую вставку и вам нужны возвращаемые значения всех идентификаторов AUTO_INCREMENT?

Возьмите эту таблицу:

Name     |   Data1    |    Data2    |      Data3
---------------------------------------------------
Name 1   |   blah     |    Herp     |      Derp
Name 2   |   rwwe     |    asdf     |      3445
Name 3   |   asdf     |    asdf     |      8678
Name 1   |   guih     |    adsf     |      3565
Name 1   |   asfg     |    rwer     |      7877

Мне нужно вставить значение Name 1 в таблицу, а затем взять это primary key и вставить значения из Data1, 2 и 3 в другие таблицы, которые имеют ограничение первичного ключа.

Проблема в том, что «Имя» не уникально, поэтому я не могу запросить исходную/промежуточную таблицу и получить значения таким образом.

Согласно документации, last_insert_id() работает в контексте одного оператора INSERT. Я все-таки протестировал.

введите здесь описание изображения

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

insert into test_fetch_id(lastname,Last_ID)
select RESOURCE_ID, last_insert_id() from resources r limit 100;

Даю мне: введите здесь описание изображения

Любая помощь будет принята с благодарностью.


person Jamie S    schedule 16.07.2014    source источник
comment
Если вы не можете получить диапазон идентификаторов от последнего вставленного идентификатора до последнего вставленного за вычетом количества затронутых строк, вы можете взять последнюю вставку после каждого вызова вставки и сохранить ее где-нибудь за пределами MySQL.   -  person Shomz    schedule 16.07.2014
comment
Привет, Шромз, это один оператор вставки. (Это проблема). Если я что-то пропустил?   -  person Jamie S    schedule 16.07.2014
comment
АФАИК это невозможно. Метод последнего идентификатора может возвращать только один последний вставленный идентификатор.   -  person ToBe    schedule 16.07.2014
comment
Итак: stackoverflow.com/questions/8481421/   -  person didierc    schedule 16.07.2014
comment
Если у вас правильная настройка, достаточно просто получить last_insert_id и узнать, сколько строк вы вставили. В противном случае вам может понадобиться дополнительный столбец для хранения идентификатора вставки группы, который позволит вам выбрать то, что вы вставили позже.   -  person didierc    schedule 16.07.2014
comment
Это хорошая информация, но решение не так просто - исходная вставка, из которой генерируется первичный ключ, на самом деле представляет собой 2 фрагмента неуникальных данных. Мне нужно немедленно действовать по этому ключу и переходить к следующему, способ вставки этих результатов не является детерминированным. У меня есть решение, которое довольно хорошо работает с использованием курсора более 2000 строк (тест), но мне нужно масштабировать его до 400 000, поэтому я ищу групповой метод.   -  person Jamie S    schedule 16.07.2014
comment
Возможно, просто ВОЗМОЖНО, вы ищете триггерное решение. См. документацию по триггеру mysql, особенно ПОСЛЕ INSERT.   -  person David162795    schedule 06.11.2014


Ответы (1)


Что ж, получается, что с MySQL... работать неудобно, однако, если кому-то нужно решение, вот оно:

Вам нужно создать курсор и установить для него значение last_insert_id(). Например:

    declare last_insert_pk int;
    declare last_insert2_pk int;

Затем в курсоре вы устанавливаете последние вставленные pk для этой итерации:

    set last_insert_pk = last_insert_id();
    -- ...some stuff...
    set _insert2_pk = last_insert_id();

Мне пришлось использовать 8 разных первичных ключей в гигантской таблице отношений, однако это сработало очень хорошо. Может быть лучший способ, но это понятно и повторяемо.

Удачи!

person Jamie S    schedule 14.11.2014