从mysql插入查询获取新的logging主键ID?
好吧,让我们说我正在做一个MySQL INSERT
到我的一个表中,并且该表的列item_id
被设置为autoincrement
和primary 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