繁体   English   中英

MySQL LAST_INSERT_ID查询

[英]MySQL LAST_INSERT_ID Query

我看过官方文档,但仍然有些困惑。

说我有一个过程,它运行并执行插入,然后我请求LAST_INSERT_ID() ,我是从正在运行的过程实例刚刚完成的插入中获取最后一个插入ID,还是通过任何被称为过程的实例/会话?

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

您在问题中提供的指向文档页面的链接确实有一个答案:

生成的ID在每个连接的服务器中维护。 这意味着函数返回给定客户端的值是针对该客户端影响AUTO_INCREMENT列的最新语句生成的第一个AUTO_INCREMENT值。 即使其他客户端生成自己的AUTO_INCREMENT值,该值也不会受到其他客户端的影响。 此行为可确保每个客户端都可以检索自己的ID,而不必担心其他客户端的活动,也不需要锁或事务。

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

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

如果前一条语句返回错误,则LAST_INSERT_ID()的值未定义。 对于事务表,如果由于错误而回滚该语句,则LAST_INSERT_ID()的值将保持未定义状态。 对于手动ROLLBACK,LAST_INSERT_ID()的值不会恢复为事务之前的值; 它保持在ROLLBACK时的状态。

您链接到的文档说:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM