假设我正在对我的一个表进行MySQL INSERT操作,该表有列item_id,它被设置为自动递增和主键。

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

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

如果这是不可能的,那么什么是最佳实践,以确保我检索正确的id?


当前回答

小心! !如果试图在PHP中返回这个主键值,则返回LAST_INSERT_ID()。

我知道这个线程没有标记PHP,但是对于任何遇到这个答案的人来说,他们希望使用标准的mysql_query调用从PHP脚本插入返回MySQL插入id -它不会工作,而且在没有捕获SQL错误的情况下并不明显。

更新的mysqli支持多个查询——LAST_INSERT_ID()实际上是原始查询的第二个查询。

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

其他回答

我使用return $this->db->insert_id();对于Codeigniter

我只是想分享我在PHP中的方法,有些人可能会发现这不是一个有效的方法,但这比其他可用的选项好100。

生成一个随机键并将其插入到表中,创建一个新行。 然后可以使用该键来检索主键。 使用更新来添加数据和做其他事情。

这样做有助于保护行并拥有正确的主键。

我真的不建议你这样做,除非你没有其他选择。

您需要使用LAST_INSERT_ID()函数:http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id

Eg:

INSERT INTO table_name (col1, col2,...) VALUES ('val1', 'val2'...);
SELECT LAST_INSERT_ID();

这将得到你插入的最后一行的PRIMARY KEY值:

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

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

简单的使用方法:

$last_id = mysqli_insert_id($conn);

如果在python中使用pymysql,则可以从光标中使用cursor.lastrowid。

它是PEP-249 DB API标准中的一个文档扩展,也可以与其他Python MySQL实现一起使用。