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在支持的数据类型上有一些不足,可以改用第一种。它应该具有相同的行为。
从特定 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在支持的数据类型上有一些不足,可以改用第一种。它应该具有相同的行为。