Получить новый идентификатор первичного ключа записи из запроса вставки mysql?
Итак, давайте скажем, что я делаю mysql INSERT
в одной из моих таблиц, а таблица имеет столбец item_id
, который установлен в autoincrement
и primary key
.
Как получить запрос для вывода значения вновь созданного первичного ключа item_id
в том же запросе?
В настоящее время я запускаю второй запрос для извлечения идентификатора, но это вряд ли кажется хорошей практикой, поскольку это может привести к неправильному результату...
Если это невозможно, то какова наилучшая практика для получения правильного идентификатора?
Ответы
Ответ 1
Вам необходимо использовать функцию LAST_INSERT_ID()
: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id
Например:
INSERT INTO table_name (col1, col2,...) VALUES ('val1', 'val2'...);
SELECT LAST_INSERT_ID();
Это вернет вам значение PRIMARY KEY
последней вставленной вами строки:
Сгенерированный идентификатор сохраняется на сервере для каждого соединения. Это означает, что значение, возвращаемое функцией данному клиенту, является первым значением AUTO_INCREMENT, сгенерированным для самого последнего оператора, влияющего на столбец AUTO_INCREMENT этим клиентом.
Таким образом, значение, возвращаемое LAST_INSERT_ID()
каждого пользователя и не зависит от других запросов, которые могут выполняться на сервере от других пользователей.
Ответ 2
ОСТОРОЖНО! из "LAST_INSERT_ID()" , если вы пытаетесь вернуть это значение первичного ключа в PHP.
Я знаю, что этот поток не помечен php, но для любого, кто наткнулся на этот ответ, хочет вернуть идентификатор вставки MySQL из вставки с PHP-скриптом, используя стандартные вызовы mysql_query, - он не работает и не очевиден без захвата ошибок SQL.
Новый mysqli поддерживает несколько запросов, которые LAST_INSERT_ID() фактически являются вторым запросом из оригинала.
IMO отдельный SELECT для идентификации последнего первичного ключа безопаснее, чем функция mysql_insert_id(), возвращающая идентификатор AUTO_INCREMENT, сгенерированный из предыдущей операции INSERT.
Ответ 3
Из документации LAST_INSERT_ID()
:
Идентификатор, который был сгенерирован, поддерживается на сервере для каждого подключения
То есть, если у вас есть два отдельных запроса к script одновременно, они не будут влиять друг на друга LAST_INSERT_ID()
(если вы не используете постоянное соединение, возможно).
Ответ 4
Вот что вы ищете!!!
select LAST_INSERT_ID()
Это лучшая альтернатива функции SCOPE_IDENTITY()
, используемой в SQL Server
.
Вам также нужно иметь в виду, что это будет работать, только если Last_INSERT_ID()
будет запущен после вашего запроса Insert
.
Это запрос возвращает идентификатор, вставленный в схему. Вы не можете получить конкретный последний вставленный идентификатор таблицы.
Для получения дополнительной информации перейдите по ссылке Эквивалент функции SQLServer SCOPE_IDENTITY() в mySQL?
Ответ 5
Если вам нужно значение перед вставкой строки:
CREATE FUNCTION `getAutoincrementalNextVal`(`TableName` VARCHAR(50))
RETURNS BIGINT
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE Value BIGINT;
SELECT
AUTO_INCREMENT INTO Value
FROM
information_schema.tables
WHERE
table_name = TableName AND
table_schema = DATABASE();
RETURN Value;
END
Вы можете использовать это в вставке:
INSERT INTO
document (Code, Title, Body)
VALUES (
sha1( concat (convert ( now() , char), ' ', getAutoincrementalNextval ('document') ) ),
'Title',
'Body'
);
Ответ 6
Эти параметры будут получены в результате вашего запроса:
"fieldCount": 0,
"affectedRows": 1,
"insertId": 66,
"serverStatus": 2,
"warningCount": 1,
"message": "",
"protocol41": true,
"changedRows": 0
insertId
именно то, что вам нужно.
(NodeJS-MySql)
Ответ 7
Если в python используется pymysql, из курсора вы можете использовать cursor.lastrowid
Ответ 8
просто используйте "$ last_id = mysqli_insert_id ($ conn);"
Ответ 9
Если вы используете PHP: На объекте PDO вы можете просто вызвать метод lastInsertId после вставки.
В противном случае с помощью LAST_INSERT_ID вы можете получить следующее значение: SELECT LAST_INSERT_ID();
Ответ 10
Я стал скрытным подписчиком, чтобы проголосовать за последний комментарий. Хотя мне не хватает "репутации", я чуть не сдал ее за голос -1, но что не так с ответом на вопрос из разных способов вызова mysql. Отличный ответ.
Ответ 11
Лучший способ решить проблему IMHO - позволить вашему коду генерировать случайный uuid, а затем использовать этот uuid в качестве идентификатора первичного ключа для вашего запроса INSERT. В этот момент ваш код уже знает "последний вставленный идентификатор", который является вашим uuid, и вы можете использовать его в других запросах MySQL. Идентификатор гарантированно будет уникальным, поэтому у вас не будет коллизий. Обязательно создайте первичный индекс для ваших столбцов uuid
Ответ 12
я использовал return $this->db->insert_id();
для Codeigniter
Ответ 13
Если LAST_INSERT_ID()
действует немного странно или не работает, как это для меня, тогда используйте это простое выражение...
--- INSERT STATEMENT GOES HERE ---
SELECT id FROM table ORDER BY id DESC LIMIT 1;
Это должно вернуть наибольший идентификатор в таблице, таким образом, последний идентификатор вставлен