我在应用程序中实现自动递增逻辑时遇到问题。说我插入了一个“组”,在 mysql 中它的 Id 值为 10,下一个将是 11、12 等等。
但是一旦记录(假设它的 ID 为 12)被删除,下一个新项目又是 12。所以可能会有冲突。
有可能使自动递增不重复相同的 Int 吗?我希望每个 Id 都是唯一的,一旦它被删除就意味着它永远不会回来。
最佳答案
InnoDB 确实有这个“特性”或 Bug,最近的 auto_increment 没有存储在表空间中。一旦您重新启动 MySQL 服务器,“auto_increment”值就会从表的最近最高值中获取,因此与可能已删除的值发生冲突。
这个解决方案真的很难看。您可以创建一个表,每个表的未使用值最高,形式为
tablename maxvalue
tableA 375
tableB 12
如果您管理 MySQL 服务器,您可以编写启动后脚本。因此,在每次删除此类表的一行之后,您将在每次删除后检查该行是否为最大值。使用较新版本的 MySQL 会更容易一些,因为表信息存储在 INFORMATION_SCHEMA 中,而不是仅在每次选择时计算(这意味着读取 INFORMATION_SCHEMA 不会如此频繁地触发繁重和阻塞的查询)。
如果删除的行是最大值,您只需更新最大值。
如果不会减慢系统速度,则在一行中每次插入时更新最大值会更容易一些。
在某些情况下,您只有一个包含关键引用的表,并且该表有一个索引,因此您可以从该表中检索最大值。
总而言之,这是 InnoDB 的一个大问题,为这个未保存的数字 auto_increment 编写大量触发器真的不是很好。
关于mysql - 自动递增和唯一性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23443171/