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

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

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

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


当前回答

从LAST_INSERT_ID()文档:

生成的ID在服务器中以每个连接为基础进行维护

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

其他回答

你需要对事务使用LAST_INSERT_ID()函数:

START TRANSACTION;
  INSERT INTO dog (name, created_by, updated_by) VALUES ('name', 'migration', 'migration');
  SELECT LAST_INSERT_ID();
COMMIT;

http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id

此函数将返回表中最后插入的主键。

您需要使用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()返回的值是每个用户的,不受其他用户可能在服务器上运行的其他查询的影响。

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

简单的使用方法:

$last_id = mysqli_insert_id($conn);

这样做:

$idc = DB::table('tb_clients')->insertGetId([
                'ide'                   => $ide,
                'nome'                  => $nome,
                'email'                 => $email 
            ]);

在$idc上,您将获得最后一个id