假设我正在对我的一个表进行MySQL INSERT操作,该表有列item_id,它被设置为自动递增和主键。
如何让查询在同一查询中输出新生成的主键item_id的值?
目前,我正在运行第二个查询来检索id,但这似乎不是一个好的做法,考虑到这可能会产生错误的结果…
如果这是不可能的,那么什么是最佳实践,以确保我检索正确的id?
假设我正在对我的一个表进行MySQL INSERT操作,该表有列item_id,它被设置为自动递增和主键。
如何让查询在同一查询中输出新生成的主键item_id的值?
目前,我正在运行第二个查询来检索id,但这似乎不是一个好的做法,考虑到这可能会产生错误的结果…
如果这是不可能的,那么什么是最佳实践,以确保我检索正确的id?
当前回答
我只是想分享我在PHP中的方法,有些人可能会发现这不是一个有效的方法,但这比其他可用的选项好100。
生成一个随机键并将其插入到表中,创建一个新行。 然后可以使用该键来检索主键。 使用更新来添加数据和做其他事情。
这样做有助于保护行并拥有正确的主键。
我真的不建议你这样做,除非你没有其他选择。
其他回答
我只是想分享我在PHP中的方法,有些人可能会发现这不是一个有效的方法,但这比其他可用的选项好100。
生成一个随机键并将其插入到表中,创建一个新行。 然后可以使用该键来检索主键。 使用更新来添加数据和做其他事情。
这样做有助于保护行并拥有正确的主键。
我真的不建议你这样做,除非你没有其他选择。
您将在查询结果中收到以下参数:
"fieldCount": 0,
"affectedRows": 1,
"insertId": 66,
"serverStatus": 2,
"warningCount": 1,
"message": "",
"protocol41": true,
"changedRows": 0
insertId正是您所需要的。
(NodeJS-mySql)
如果在插入行之前需要该值:
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'
);
小心! !如果试图在PHP中返回这个主键值,则返回LAST_INSERT_ID()。
我知道这个线程没有标记PHP,但是对于任何遇到这个答案的人来说,他们希望使用标准的mysql_query调用从PHP脚本插入返回MySQL插入id -它不会工作,而且在没有捕获SQL错误的情况下并不明显。
更新的mysqli支持多个查询——LAST_INSERT_ID()实际上是原始查询的第二个查询。
在我看来,一个单独的SELECT来标识最后一个主键比可选的mysql_insert_id()函数更安全,该函数返回由前面的INSERT操作生成的AUTO_INCREMENT ID。
这就是你要找的东西!!
select LAST_INSERT_ID()
这是在SQL Server中使用SCOPE_IDENTITY()函数的最佳替代方案。
您还需要记住,这只有在插入查询之后触发Last_INSERT_ID()时才会起作用。 即查询返回插入到模式中的id。无法获取特定表的最后插入id。
有关更多细节,请通过链接SQLServer函数SCOPE_IDENTITY()在mySQL?