В mysql, как мне получить первичный ключ, используемый для операции вставки, когда он автоматически увеличивается.
По сути, я хочу, чтобы новое автоматически увеличиваемое значение возвращалось после завершения оператора.
Спасибо!






MySQL LAST_INSERT_ID ()
Документы MySQL описывают функцию: LAST_INSERT_ID ()
[выберите max (primary_key_column_name) из table_name] Аааа, не обязательно. Я не специалист по MySQL, но есть конкретный способ получить последний вставленный идентификатор для последнего завершенного действия, который немного более надежен, чем этот. Что, если между записью в таблицу и запросом произошла вставка? Я знаю об этом, потому что он ужалил меня много лун назад (так что да, это действительно происходит). Если ничего не помогает, прочтите руководство: http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html
В вашем пояснительном комментарии говорится, что вы заинтересованы в том, чтобы LAST_INSERT_ID () не давал неправильный результат, если происходит еще один параллельный INSERT. Будьте уверены, что LAST_INSERT_ID () безопасно использовать независимо от других одновременных действий. LAST_INSERT_ID () возвращает только самый последний идентификатор, сгенерированный во время текущего сеанса.
Можете попробовать сами:
Если задуматься, это единственный способ, который имеет смысл. Все базы данных, поддерживающие механизмы автоматического увеличения ключа, должны действовать таким образом. Если результат зависит от состояния гонки с другими клиентами, которые могут вставлять одновременно, тогда не будет надежного способа получить последнее вставленное значение идентификатора в вашем текущем сеансе.
@Bill Karwin большое спасибо за этот полезный пост. Вопрос: Скажем, в многопоточной среде последнее доступное значение ключа Auto inc было 10 .. тогда поток оболочки 1 не может вставить, и в тот же момент оболочка 2 вставляет ... что было бы last_insert_id ()? 11 или 12? большое спасибо
@shadesco: Зависит от вашей версии MySQL, но в 5.1 и более поздних версиях с InnoDB первый сеанс будет увеличивать auto-inc, и это значение будет потеряно. Тогда второй сеанс получит 12. См. dev.mysql.com/doc/refman/5.1/en/….
Уточнение: в коде есть вставка, а затем last_insert_id. Два из этих операторов выполняются почти одновременно, и порядок выполнения превращается в вставку # 1 вставку # 2 last_insert_id # 1 завершается и возвращает идентификатор из вставки # 2 last_insert_id # 2 завершается и возвращает идентификатор из вставки # 2 Может ли это случиться?