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

411

假设我在对我的一个表执行MySQL INSERT 操作,表中有一个名为item_id的列,该列被设置为autoincrementprimary key

如何在同一查询中获取新生成的主键item_id的值?

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

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


9
如果由两个人分别执行该过程,那么我认为你可能会得到一个重叠的过程列表 - 因为你必须执行两个单独的查询? - Amy Neville
@JimFell 是的,基本上是同一个问题,但这个问题的答案普遍更好。 - RozzA
1
使用 PostgreSQL 时,请按如下方式操作: INSERT INTO table (col1,col2) VALUES (val1,val2) RETURNING id 或者 INSERT INTO table (col1,col2) VALUES (val1,val2) RETURNING * 或者 UPDATE table SET col1=val1, col2=val2 WHERE statement RETURNING id 或者 UPDATE table SET (col1,col2)=(val1,val2) WHERE statement RETURNING id 或者 UPDATE table SET (col1,col2)=(val1,val2) WHERE statement RETURNING * - gdarcan
13个回答

3
我在 Codeigniter 中使用了 return $this->db->insert_id();

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

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


-2

我只是想分享一下我在PHP中处理这个问题的方法,可能有些人觉得这不是一种高效的方式,但相比其他可用选项,这绝对好上100倍。

首先生成一个随机密钥并将其插入到表中创建新行。 然后你可以使用该密钥来检索主键。 使用更新操作添加数据和执行其他操作。

这种做法有助于保护行的安全性并确保正确的主键。

除非没有其他选择,否则我真的不推荐这样做。


1
你可以使用PDO对象并获取最后插入的ID。在同一事务中,您还可以使用SELECT LAST_INSERT_ID()(如果有多个人插入,则使用相同的事务非常重要)。您提出的方法没有保证 - 尽管不太可能,但键可能会发生冲突。此外,通过更新添加所有数据意味着您无法拥有非空字段,这也会导致更糟糕的数据完整性。最后,在随机密钥插入和更新之间可能会出现故障,您将得到一个不需要的状态和没有数据完整性。 - Enrico
我不知道为什么作者建议将插入和更新作为两个不同的操作;当我不得不使用这种方法时,我通过代码生成了随机密钥,并在插入查询中与所有记录字段一起使用它。老实说,使用UUID几乎不可能发生冲突(16^32种可能性)。我认为这种方法是解决OP问题的有效方案。 - Jack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接