在 MySQL/InnoDB 中模拟自动增量
假设我要
条件
- 使用 MySQL/InnoDB 模拟 MySQL/InnoDB
- 中的自动增量ID 字段没有唯一索引,也不是 PK
是否可以仅使用程序逻辑来模拟,而不使用表级锁。 谢谢。
Assume I am going to emulate auto-increment in MySQL/InnoDB
Conditions
- Using MySQL/InnoDB
- The ID field don't have unique index, nor it is a PK
Is it possible to emulate only using program logics, without table level lock.
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
使用序列表和触发器 - 像这样:
Use a sequence table and a trigger - something like this:
SELECT LAST_INSERT_ID();
甚至是一个会话安全值,用于检查您获得的 ID。确保您的表支持事务,或者序列中的漏洞没有问题。SELECT LAST_INSERT_ID();
Is even a session-safe value to check which ID you got. Be sure your table support transactions, or that holes in a sequence are no problem.创建另一个具有单行单列的表,用于存储下一个 id 值。然后在原始表上创建一个插入触发器,增加第二个表中的值,获取该值,并将其用于第一个表上的 ID 列。您需要小心选择和更新的方式,以确保它们是原子的。
本质上,您是在 MySQL 中模拟 Oracle
序列
。但这会导致序列表中的单行被锁定,因此这可能使其不适合您正在做的事情。ETA:
另一个类似但可能性能更好的选项是创建第二个“序列”表,该表只有一个自动增量 PK 列,没有其他数据。让插入触发器在该表中插入一行,并使用从那里生成的 ID 来填充原始表中的 ID。然后让触发器或另一个进程定期删除序列表中的所有行以清理它。
Create another table with a single row and column that stores the next id value. Then create an insert trigger on the original table that increments the value in the second table, grabs it, and uses that for the ID column on the first table. You would need to be careful with the way you do the select and update to ensure they are atomic.
Essentially you are emulating an Oracle
sequence
in MySQL. It would cause a lock on single row in the sequence table though, so that may make it inappropriate for what you are doing.ETA:
Another similar but maybe better performing option would be to create a second "sequence" table that just has a single auto-increment PK column and no other data. Have your insert trigger insert a row into that table and use the generated ID from there to populate the ID in the original table. Then either have the trigger or another process periodically delete all the rows from the sequence table to clean it up.
序列表需要有id作为自增PK
sequence table need to have id as the autoincrement PK