Как получить идентификатор последней вставки из таблицы с auto_increment, который не является частью последней вставки в транзакции?

Можно ли получить текущий идентификатор первичного ключа auto_increment из таблицы, которая не была таблицей, в которую было вставлено значение при последней вставке?

Ситуация, в которой я нахожусь, выглядит так:

1 - я вставляю оценку в таблицу Evaluation.

2 - Затем я вставляю в таблицу Evaluation_Details результаты для каждого вопроса, связанного с оценкой, используя last_insert_id() и

3 - Я, наконец, вычисляю всю статистику, которая мне нужна для оценки, на основе результатов вопросов, и мне нужно обновить таблицу Evaluation с ее помощью.

Теперь вот проблема. Мне нужно получить идентификатор последней вставки в таблицу Evaluation, но теперь last_insert_id() вернет идентификатор последней вставки в таблицу Evaluatin_Details.

Все делается в одной транзакции, и каждая таблица имеет auto_increment в своем идентификаторе.

Я знаю, что запрос:

SELECT `AUTO_INCREMENT`
FROM  INFORMATION_SCHEMA.TABLES"
WHERE TABLE_SCHEMA = 'database_name'
AND   TABLE_NAME   = 'table_name';

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

изменить: я забыл добавить, что возможно, что несколько пользователей вставляют данные одновременно. Вот почему я не использовал MAX(id) from table_name.

Спасибо!


person JP P.    schedule 06.08.2013    source источник
comment
Почему бы не просто SELECT MAX(id) FROM table_name?   -  person Joseph Silber    schedule 06.08.2013
comment
Отредактированный вопрос, я забыл упомянуть, что несколько вставок могут выполняться разными пользователями одновременно. Спасибо за ваш комментарий.   -  person JP P.    schedule 06.08.2013
comment
Я думаю, вы должны добавить схему таблиц в свой вопрос. Моя первая мысль заключается в том, что у вас уже должен быть нужный вам идентификатор, иначе как вы могли бы выполнять вставки в таблицу Evaluation_Details, связанные с оценкой   -  person Tasos P.    schedule 06.08.2013
comment
Я не думаю, что возможно получить предыдущие идентификаторы вставки. SELECT AUTO_INCREMENT ...` не будет работать по той же причине, что и SELECT MAX(id). Что мешает получить id сразу после 1-й вставки?   -  person Vatev    schedule 06.08.2013
comment
На втором шаге, который вы описываете, вы вставляете несколько записей в Evaluation_Details, используя last_insert_id() из вставки таблицы Evaluation. Поскольку у вас есть этот идентификатор (я полагаю, в какой-то переменной), почему вы не можете использовать его для выполнения своего последнего запроса? Я очень надеюсь, что вы не используете last_insert_id() при каждой вставке в Evaluation_Details...   -  person Tasos P.    schedule 06.08.2013
comment
@Каскадер Спасибо! Я совершенно вылетел из головы, что я могу использовать переменные. Я протестировал его, и он работает отлично. Теперь я не знаю, можете ли вы опубликовать это как ответ, чтобы я мог принять его, опубликовать сам или просто закрыть вопрос?   -  person JP P.    schedule 06.08.2013
comment
Я просто перефразирую это и опубликую как ответ   -  person Tasos P.    schedule 07.08.2013


Ответы (1)


На втором шаге, который вы описываете, вы вставляете несколько записей в Evaluation_Details, используя last_insert_id() из вставки таблицы Evaluation. Поскольку у вас есть этот идентификатор, вы можете сохранить его в переменной и использовать для выполнения вашего последнего запроса.

person Tasos P.    schedule 06.08.2013