Итак, допустим, я делаю mysql INSERT
в одну из моих таблиц, и в таблице есть столбец, item_id
который установлен в autoincrement
и primary key
.
Как получить запрос на вывод значения вновь созданного первичного ключа item_id
в том же запросе?
В настоящее время я выполняю второй запрос для получения идентификатора, но вряд ли это хорошая практика, учитывая, что это может привести к неправильному результату ...
Если это невозможно, то каков наилучший способ обеспечить получение правильного идентификатора?
mysql
insert
key
auto-increment
Эми Невилл
источник
источник
INSERT
запроса; почему вы думаете, что это может дать неправильный результат?Ответы:
Вам необходимо использовать
LAST_INSERT_ID()
функцию: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-idНапример:
Это вернет вам
PRIMARY KEY
значение последней строки, которую вы вставили:Таким образом, значение, возвращаемое для
LAST_INSERT_ID()
каждого пользователя, не зависит от других запросов, которые могут выполняться на сервере от других пользователей .источник
PRIMARY KEY
значение последней строки, которую вы вставили, потому что это для каждого соединения - каждое соединение с сервером будет сохранять для этого свое значение. Я обновил ответ, чтобы уточнить это.BEWARE !! "LAST_INSERT_ID ()", если вы пытаетесь вернуть значение этого первичного ключа в PHP.
Я знаю, что этот поток не помечен как php, но для всех, кто сталкивался с этим ответом и хочет вернуть идентификатор вставки MySQL из вставки с PHP-скриптом, используя стандартные вызовы mysql_query - он не будет работать и не будет очевиден без регистрации ошибок SQL.
Более новый mysqli поддерживает несколько запросов - который LAST_INSERT_ID () на самом деле является вторым запросом от оригинала.
IMO, отдельный SELECT для идентификации последнего первичного ключа безопаснее, чем дополнительная функция mysql_insert_id (), возвращающая идентификатор AUTO_INCREMENT, сгенерированный из предыдущей операции INSERT.
источник
LAST_INSERT_ID
является функцией MySQL для каждого соединения Если вы запросите последний идентификатор вставки, возможно, отдельное соединение выполнит запись, и у вас будет неправильный идентификатор.mysql_insert_id()
также работает для каждого отдельного соединения, но также страдает странным поведением, как показано здесь stackoverflow.com/a/897374/1305910 в комментарии Cliffordlife - не говоря уже о том, что мы все должны были использоватьmysqli
Из
LAST_INSERT_ID()
документации:То есть, если у вас есть два отдельных запроса к сценарию одновременно, они не будут влиять друг на друга
LAST_INSERT_ID()
(если, возможно, вы не используете постоянное соединение).источник
Вот что вы ищете !!!
Это лучшая альтернатива
SCOPE_IDENTITY()
функции, используемой вSQL Server
.Вам также нужно помнить, что это будет работать только в том случае, если
Last_INSERT_ID()
по вашемуInsert
запросу запущено. То есть запрос возвращает идентификатор, вставленный в схему. Вы не можете получить последний вставленный идентификатор конкретной таблицы.Для получения более подробной информации перейдите по ссылке Эквивалентная функция SQLServer SCOPE_IDENTITY () в MySQL?
источник
Если вам нужно значение перед вставкой строки:
Вы можете использовать это во вставке:
источник
Вы получите эти параметры в результате запроса:
Это
insertId
именно то, что вам нужно.(NodeJS-MySql)
источник
Если в python используется pymysql, из курсора вы можете использовать cursor.lastrowid
источник
просто используйте "$ last_id = mysqli_insert_id ($ conn);"
источник
Если вы используете PHP: На объекте PDO вы можете просто вызвать метод lastInsertId после вставки.
В противном случае с LAST_INSERT_ID вы можете получить значение, подобное этому:
SELECT LAST_INSERT_ID();
источник
я использовал
return $this->db->insert_id();
для Codeigniterисточник
Я просто хочу поделиться своим подходом к этому в PHP, некоторые из вас могут найти его неэффективным способом, но это на 100 лучше, чем другие доступные варианты.
сгенерируйте случайный ключ и вставьте его в таблицу, создав новую строку. затем вы можете использовать этот ключ для получения первичного ключа. используйте обновление, чтобы добавить данные и делать другие вещи.
Это помогает защитить строку и получить правильный первичный ключ.
Я действительно не рекомендую это, если у вас нет других вариантов.
источник