一尘不染

MySql 的 LAST_INSERT_ID() 函数是否保证正确?

mysql

INSERT当我对具有列的表执行单行时,AUTO_INCREMENT我想使用该LAST_INSERT_ID()函数返回AUTO_INCREMENT为该行存储的新 ‘ed 值。

毫无疑问,许多 Microsoft SQL Server 开发人员和管理员都知道 SQL Server ( SCOPE_IDENTITYand @@IDENTITY) 中的等效功能并非没有问题

我知道 MySQL 文档状态:

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

(资源)

甚至说:

从多个客户端同时使用LAST_INSERT_ID()AUTO_INCREMENT列是完全有效的。

(资源)

是否存在任何可能导致LAST_INSERT_ID()无法返回正确值的已知风险或场景?

我在 CentOS 5.5 x64 和 Fedora 16 x64 以及 InnoDB 引擎上使用 MySQL 5.5。


阅读 62

收藏
2022-10-10

共1个答案

一尘不染

我想在使用时指出一些注意事项LAST_INSERT_ID

  1. 我知道您提到了单行插入。但是在进行多行插入时,LAST_INSERT_ID()将返回插入的第一行(不是最后一行)的值。
  2. 如果插入失败,LAST_INSERT_ID()将是未定义的。对于事务的自动回滚(由于错误)也是如此。
  3. 如果您在成功的事务中执行插入,并且您仍然发出ROLLBACK,LAST_INSERT_ID()将保持回滚之前的状态。
  4. 在使用和基于语句的复制时有几个注意事项。第一个是在触发器或函数中使用时。第二个是不太常见的情况,您的 auto_increment 列是复合主键的一部分,而不是键中的第一列。AUTO_INCREMENT``LAST_INSERT_ID
2022-10-10