MySQL LAST_INSERT_ID查询

时间:2015-05-21 22:39:09

标签: mysql insert procedure last-insert-id

我看过official documentation,但我仍然有些困惑。

假设我有一个程序,它运行并执行插入,然后我请求rake routes,我是刚从我的程序运行实例完成插入的最后一个插入ID,还是最后一个插入任何被调用过程的实例/会话在表上的id?

例如,说最后插入的记录ID是4,我调用了该过程,我的插入将是id 5,但我的插入失败,我将返回4作为最后一个插入id或null / 0值?

2 个答案:

答案 0 :(得分:3)

您在问题中提供的文档页面非常link有一个答案:

  

生成的ID在服务器上维护   每个连接基础。这意味着返回的值   给定客户端的函数是生成的第一个AUTO_INCREMENT值   对于影响AUTO_INCREMENT列的最新语句   客户。此值不受其他客户端的影响,即使它们也是如此   生成自己的AUTO_INCREMENT值。此行为可确保   每个客户端都可以检索自己的ID而无需担心   其他客户的活动,无需锁或   交易。

因此,其他客户没有竞争条件。您需要在与LAST_INSERT_ID()相同的连接中请求INSERT才能获得正确的结果。

至于回滚事务时会发生什么,它是未定义的:

  

如果前一个语句返回错误,则返回值   LAST_INSERT_ID()未定义。对于事务表,如果是   语句由于错误而回滚,值为   LAST_INSERT_ID()未定义。对于手动ROLLBACK,其值为   LAST_INSERT_ID()未恢复到事务之前的状态;它   仍然像ROLLBACK那样。

答案 1 :(得分:1)

您链接的文档说:

  

生成的ID基于每个连接在服务器中维护。这意味着函数返回给定客户端的值是为该客户端影响AUTO_INCREMENT列的最新语句生成的第一个AUTO_INCREMENT值。此值不受其他客户端的影响,即使它们生成自己的AUTO_INCREMENT值。

这意味着您可以安全地依赖LAST_INSERT_ID()返回的值。它是由调用LAST_INSERT_ID()的相同代码实例生成的最新自动递增值。当然,您必须在要获取其值的INSERT语句之后立即调用它,它不能返回最近的第二个INSERT语句或更早的语句生成的值。