Восстановить сгенерированные идентификаторы из запроса на множественную вставку - PullRequest
1 голос
/ 30 июля 2010

Я хочу выполнить запрос в форме:

INSERT INTO таблица (field1, field2) SELECT field1, field2 ИЗ таблицы WHERE id IN (4, 8, 15, 16, 23, 42)

Где id - это первичный ключ auto_increment'а table.

. После выполнения этого оператора я хочу знать, что представляют собой все только что созданные новые идентификаторы.Как я могу восстановить эту информацию?Я заинтересован (возможно) сделать это в хранимой процедуре и вернуть список вновь созданных идентификаторов в код моего приложения (скажем, в PHP), и я хотел бы, чтобы список был в коррелированном порядке с тем, что появляется в предложении INиз подзапроса SELECT.Я думаю, что это спасло бы меня много последовательных вставок в код моего приложения.Это достижимо?

Ответы [ 3 ]

3 голосов
/ 30 июля 2010

Если у вас есть контроль над таблицей (или вы можете создать другую таблицу), как насчет хранения «action_id? »

Если вы добавите его на свой стол, вы можете сделать что-то вроде этого:

Declare @tranId int
Select @tranId = Max(transaction_id) + 1 from [table]
Insert Into [table] (field1, field2, transactionId)
Select field1, field2, @tranId
From //the rest of your query

Вы бы вытащили новые идентификаторы:

Select Id from [table] where transaction_id = @tranId

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

3 голосов
/ 30 июля 2010

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

0 голосов
/ 30 июля 2010

Вы можете получить только последний идентификатор вставки, НО вы можете получить затронутые строки ...

, поэтому идентификаторы будут

  $ids = range($lastID - (--$rows), $lastID);

- $ строк, если вы хотите сохранитьпоследний идентификатор тоже.

например.последняя вставка была 18 и 3 строки затронуты, поэтому 16, 17, 18 будут вашими идентификаторами, но 18 - 3 даст 15 и, следовательно, даст 15, 16, 17, 18 идентификаторов, что было бы неправильно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...