从mysql插入查询获取新的logging主键ID?

好吧,让我们说我正在做一个MySQL INSERT到我的一个表中,并且该表的列item_id被设置为autoincrementprimary key

如何让查询输出新查询中新生成的主键item_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值。

所以这不受其他用户在服务器上运行的查询的影响。

在这里你在找什么!

 select LAST_INSERT_ID() 

这是在SQL Server中使用SCOPE_IDENTITY()函数的最佳select。

您还需要记住,只有在Insert查询触发Last_INSERT_ID() ,这才会起作用。 那就是查询返回在模式中插入的id。 你不能得到特定的表最后插入的ID。

有关更多详细信息,请通过链接相当于SQLServer函数SCOPE_IDENTITY()在MySQL?

LAST_INSERT_ID()文档:

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

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

谨防 !! 如果试图在PHP中返回这个主键值,那么就是“LAST_INSERT_ID()”

我知道这个线程没有标记的PHP,但任何人遇到这个答案寻找返回MySQL插入ID从PHP脚本插入使用标准的mysql_query调用 – 它不会工作,不明显,没有捕获SQL错误。

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

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

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

 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' ); 

如果LAST_INSERT_ID()的行为有点奇怪或不是像我这样使用这个简单的语句…

--- INSERT STATEMENT GOES HERE --- SELECT id FROM table ORDER BY id DESC LIMIT 1;

这应该返回表中最大的ID,从而插入最后一个ID