last_insert_id 的实施

Implementation of last_insert_id

从特定 table 获取最后插入的 ID 的最佳方法是什么?我看到至少四种不同的方法:

1. SELECT LAST_INSERT_ID()
2. mysql_insert_id()
3. SELECT max(id) FROM table
4. SELECT id FROM table ORDER BY id DESC LIMIT 1

第一种方法胜过第二种方法,因为第二种方法 returns 0 如果 id 具有 bigint 类型。但问题是 - 我不能确定我得到的 id - 来自我想要的 table,因为 LAST_INSERT_ID() returns 最后一个 id 在整个数据库中。第三种和第四种方法在大型 tables 上不是那么快,但第四种方法似乎在速度方面优于第三种方法。我想知道的是,伙计们,你们是如何在现实世界的项目中实现这个任务的。

3和4有多个问题,比如

  • 他们不处理并发用户
  • 他们无法处理回收的 ID 或 ID 序列中的其他类型的跳过
  • ids也可以翻车,这不是他们处理的

1 和 2 接近同一件事。它们都是特定于连接的,因此应该可以很好地处理并发用户,并且可以感知上下文,这样您就可以得到您期望的结果。

如果觉得mysql_insert_id在支持的数据类型上有一些不足,可以改用第一种。它应该具有相同的行为。