mysql 查询内主键id_从mysql插入查询中获取新记录主键ID?

从mysql插入查询中获取新记录主键ID?

好的,所以我可以说我在我的一个表中做了一个mysql item_id,该表的列为item_id,设置为autoincrement和primary key。

如何让查询在同一查询中输出新生成的主键item_id的值?

目前我正在运行第二个查询以检索id但这似乎不是一个好的做法,因为这可能会产生错误的结果......

如果这不可能,那么确保我检索正确ID的最佳做法是什么?

7个解决方案

229 votes

您需要使用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();

这将使您返回插入的最后一行的LAST_INSERT_ID()值:

生成的ID在每个连接的基础上在服务器中维护。 这意味着函数返回给定客户端的值是为该客户端影响AUTO_INCREMENT列的最新语句生成的第一个AUTO_INCREMENT值。

因此,LAST_INSERT_ID()返回的值是每个用户,不受其他用户可能在服务器上运行的其他查询的影响。

Duncan Lock answered 2019-04-10T11:10:59Z

16 votes

谨防 !! 如果尝试在PHP中返回此主键值,则为“LAST_INSERT_ID()”。

我知道这个帖子没有被标记为php,但是对于任何遇到这个答案的人来说,希望使用标准的mysql_query调用从PHP脚本插件返回一个MySQL插入ID - 它不会工作,并且不会在没有捕获SQL错误的情况下显而易见。

较新的mysqli支持多个查询 - 其中LAST_INSERT_ID()实际上是来自原始查询的第二个查询。

IMO单独的SELECT用于标识最后一个主键比可选的mysql_insert_id()函数更安全,该函数返回从先前的INSERT操作生成的AUTO_INCREMENT ID。

Martin Sansone - MiOEE answered 2019-04-10T11:11:47Z

14 votes

从LAST_INSERT_ID()文档:

生成的ID在每个连接的基础上在服务器中维护

也就是说,如果您同时对脚本提出两个单独的请求,则它们不会影响彼此'LAST_INSERT_ID()(除非您使用的是持久连接)。

Explosion Pills answered 2019-04-10T11:12:28Z

13 votes

在这里你要找的!!!

select LAST_INSERT_ID()

这是Insert中使用的Last_INSERT_ID()函数的最佳替代方案。

您还需要记住,这仅在Last_INSERT_ID()被您的Insert查询后触发时才有效。即查询返回模式中插入的id。 您无法获取特定表的最后插入ID。

有关更多详细信息,请通过链接在mySQL中等效于SQLServer函数SCOPE_IDENTITY()?

PVR answered 2019-04-10T11:13:17Z

6 votes

如果在插入行之前需要该值:

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'

);

Paulo A. Costa answered 2019-04-10T11:13:51Z

2 votes

您将在查询结果中收到以下参数:

"fieldCount": 0,

"affectedRows": 1,

"insertId": 66,

"serverStatus": 2,

"warningCount": 1,

"message": "",

"protocol41": true,

"changedRows": 0

insertId正是您所需要的。

(的NodeJS MySQL的)

MESepehr answered 2019-04-10T11:14:32Z

-2 votes

只需使用“$ last_id = mysqli_insert_id($ conn);”

Arnav Singh answered 2019-04-10T11:14:59Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值