mysql - 自动递增和唯一性问题

标签 mysql sql database

我在应用程序中实现自动递增逻辑时遇到问题。说我插入了一个“组”,在 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/

相关文章:

php - 在使用 GET url ID 创建的页面上更新 MySQL 记录

php - 从 mysql 数据为用户分配并显示排名

php - if/else 从表中更新值

php - 我想将 YII 框架与两个数据库连接,但它抛出 CDbConnection failed Incorrect database name

database - Talend Open Studio For MDM + Postgresql + 同步两个数据库

iphone - 如何将表单文件(.number/.exl/.scv)用作我的 iOS 应用程序的数据源

Mysql 查询通过选择查询获取插入的用户名和更新的用户名?

java - 在远程服务器中加载 Web 应用程序(Tomcat 上的 servlet)

sql - 如何使用 csv 格式的 where 子句执行 SQL select 语句?

mysql - 在同一查询中进一步过滤 GROUP_CONCAT 值