Простой вопрос mysql относительно первичных ключей и вставки

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

По сути, я хочу, чтобы новое автоматически увеличиваемое значение возвращалось после завершения оператора.

Спасибо!

Уточнение: в коде есть вставка, а затем last_insert_id. Два из этих операторов выполняются почти одновременно, и порядок выполнения превращается в вставку # 1 вставку # 2 last_insert_id # 1 завершается и возвращает идентификатор из вставки # 2 last_insert_id # 2 завершается и возвращает идентификатор из вставки # 2 Может ли это случиться?

MPX 03.10.2008 04:30
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
8
1
6 595
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Документы 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 () возвращает только самый последний идентификатор, сгенерированный во время текущего сеанса.

Можете попробовать сами:

  1. Откройте два окна оболочки, запустите mysql клиент в каждом и подключиться к база данных.
  2. Оболочка 1: ВСТАВИТЬ в таблицу с Ключ AUTO_INCREMENT.
  3. Оболочка 1: SELECT LAST_INSERT_ID (), увидеть результат.
  4. Оболочка 2: ВСТАВИТЬ в ту же таблицу.
  5. Оболочка 2: SELECT LAST_INSERT_ID (), увидеть результат, отличный от оболочки 1.
  6. Оболочка 1: SELECT LAST_INSERT_ID () снова, см. повторение ранее результат.

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

@Bill Karwin большое спасибо за этот полезный пост. Вопрос: Скажем, в многопоточной среде последнее доступное значение ключа Auto inc было 10 .. тогда поток оболочки 1 не может вставить, и в тот же момент оболочка 2 вставляет ... что было бы last_insert_id ()? 11 или 12? большое спасибо

ccot 01.02.2012 22:03

@shadesco: Зависит от вашей версии MySQL, но в 5.1 и более поздних версиях с InnoDB первый сеанс будет увеличивать auto-inc, и это значение будет потеряно. Тогда второй сеанс получит 12. См. dev.mysql.com/doc/refman/5.1/en/….

Bill Karwin 02.02.2012 07:56

Другие вопросы по теме