假设我在对我的一个表执行MySQL INSERT
操作,表中有一个名为item_id
的列,该列被设置为autoincrement
和primary key
。
如何在同一查询中获取新生成的主键item_id
的值?
目前我正在运行第二个查询来检索id,但这似乎不是很好的做法,因为这可能会产生错误的结果...
如果不可能,那么确保检索到正确的id的最佳实践是什么?
假设我在对我的一个表执行MySQL INSERT
操作,表中有一个名为item_id
的列,该列被设置为autoincrement
和primary key
。
如何在同一查询中获取新生成的主键item_id
的值?
目前我正在运行第二个查询来检索id,但这似乎不是很好的做法,因为这可能会产生错误的结果...
如果不可能,那么确保检索到正确的id的最佳实践是什么?
您需要使用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
值:
生成的ID在服务器上以每个连接为基础进行维护。这意味着该函数返回给定客户端的值是由该客户端最近影响到AUTO_INCREMENT列的大多数最新语句生成的第一个AUTO_INCREMENT值。
因此,LAST_INSERT_ID()
返回的值是针对每个用户的,并且不受其他正在运行的来自其他用户的查询的影响。
小心!!使用LAST_INSERT_ID()
在PHP中返回主键值。
我知道这个帖子没有标记PHP,但是对于任何想要从使用标准的mysql_query
调用的PHP脚本插入中返回MySQL插入id的人来说,它不起作用,并且如果不捕获SQL错误,则不明显。
更新的mysqli
支持多个查询,其中LAST_INSERT_ID()
实际上是从原始查询中派生的第二个查询。
在我看来,通过单独的SELECT
来识别最后一个主键比可选的mysql_insert_id()
函数更安全,后者返回上一个INSERT
操作生成的AUTO_INCREMENT ID
。
LAST_INSERT_ID
是一个基于连接的 MySQL 函数。如果你查询最后插入的 ID,那么在此期间,可能有另外一个连接已经执行了写操作,导致你获得错误的 ID。为了避免这种情况,需要确保在同一连接中查询最后插入的 ID。 - Explosion Pillsmysql_insert_id()
也是基于每个连接的,但它也会出现奇怪的行为,如 Cliffordlife 在这里的评论中所见 https://dev59.com/VXNA5IYBdhLWcg3wmfK5#897374 -- 不过没关系,我们都应该使用 mysqli
。 - RozzA根据 LAST_INSERT_ID()
的文档:
生成的ID是基于 每个连接 在服务器上进行维护的。
也就是说,如果您同时有两个独立的请求发送到脚本,它们不会影响彼此的 LAST_INSERT_ID()
(除非您可能正在使用持久连接)。
您将在查询结果中收到这些参数:
"fieldCount": 0,
"affectedRows": 1,
"insertId": 66,
"serverStatus": 2,
"warningCount": 1,
"message": "",
"protocol41": true,
"changedRows": 0
< p > insertId
就是你所需要的东西。 < /p >
< p > (NodeJS-mysql) < /p >这里是你正在寻找的东西!!!
select LAST_INSERT_ID()
这是在SQL Server中使用SCOPE_IDENTITY()
函数的最佳替代方案。
请记住,只有在您的Insert
查询之后触发Last_INSERT_ID()
时,它才能正常工作。也就是说,查询返回了插入模式中的ID。您无法获取特定表的最后插入的ID。
有关更多详细信息,请查看链接The equivalent of SQLServer function SCOPE_IDENTITY() in mySQL?
如果在Python中使用pymysql
,你可以从游标中使用cursor.lastrowid
。
这是一个在PEP-249
文档扩展中有记录的DB API标准,并且也适用于其他Python MySQL实现。
您需要在事务中使用LAST_INSERT_ID()函数:
START TRANSACTION;
INSERT INTO dog (name, created_by, updated_by) VALUES ('name', 'migration', 'migration');
SELECT LAST_INSERT_ID();
COMMIT;
http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id
该函数将返回表中最后插入的主键。
只需使用以下代码:
$last_id = mysqli_insert_id($conn);
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'
);