Mysql InnoDB中的自动增量值?

Mysql InnoDB中的自动增量值?,mysql,innodb,Mysql,Innodb,我一直在为一个项目使用InnoDB,并且依赖于自动增量。对于大多数表来说,这不是问题,但对于删除的表来说,这可能是一个问题: 特别是这一部分: 名为ai_col的自动增量列:服务器启动后,对于表t的第一次插入,InnoDB执行与以下语句等效的语句: 从t中选择MAX(ai_col)进行更新; InnoDB将语句检索到的值递增一,并将其分配给列和表的自动递增计数器。 这是一个问题,因为虽然它确保表中的键是唯一的,但该表中存在外键,这些键不再是唯一的 mysql服务器确实/不应该经常重启,但这正在

我一直在为一个项目使用InnoDB,并且依赖于自动增量。对于大多数表来说,这不是问题,但对于删除的表来说,这可能是一个问题:

特别是这一部分:

名为ai_col的自动增量列:服务器启动后,对于表t的第一次插入,InnoDB执行与以下语句等效的语句: 从t中选择MAX(ai_col)进行更新; InnoDB将语句检索到的值递增一,并将其分配给列和表的自动递增计数器。 这是一个问题,因为虽然它确保表中的键是唯一的,但该表中存在外键,这些键不再是唯一的


mysql服务器确实/不应该经常重启,但这正在破坏。有什么简单的方法可以解决这个问题吗?

使用带有“SET NULL”的外键约束进行更新和删除。

因此您有两个表:

表 A_ID[PK]

表B B_ID[PK]

A_ID[FK,表A.A_ID]

在表B中,A_ID的值不是唯一的?或者表B.a\u ID中是否有一个值不在表a.a\u ID中

如果需要TableB.A_ID的值是唯一的,则需要向该列添加唯一约束


还是我仍然缺少什么?

如果有外键约束,当表B引用某行时,如何从表a中删除该行?这对我来说似乎是个错误

无论如何,您可以通过在应用程序启动备份时重置偏移量来避免重复使用自动增量值。查询引用表A的所有表中的最大值,然后在该最大值之上更改该表,例如,如果最大值为989,则使用以下方法:

alter table TableA auto_increment=999;

还要注意,不同的MySQL引擎具有不同的自动增量行为。这一技巧适用于InnoDB。

创建另一个表,其中包含一列可记住上次创建的Id。这样,您就不必考虑将此作为外键的新表中的最大值。

我选中了。 改变表格A自动增量=1 不起作用。 我在两份文件中找到了原因

InnoDB使用以下算法初始化包含名为ai_col的自动增量列的表t的自动增量计数器:服务器启动后,对于表t的第一次插入,InnoDB执行与此语句等效的语句: 从t中选择MAX(ai_col)进行更新; InnoDB递增语句检索到的值,并将其分配给列和表的自动递增计数器。默认情况下,该值递增1。自动增量配置设置可以覆盖此默认值

不能将计数器重置为小于或等于任何已使用的值。

这就是ALTERTABLE无法工作的原因。我认为唯一的选择是删除数据并用新id在新表中重写它。 在我的例子中,表是日志文件,所以我只是:

将表SystemEvents重命名为SystemEvents\u old;
创建类似SystemEvents\u old的表SystemEvents

这就是问题所在。实际上,我复制并粘贴了错误的东西。有问题吗?最大值将从自动增量字段的索引中快速导出。没有涉及表扫描。我在顶部添加了更多的解释,但问题是有其他表引用此表,使用id作为收据。对于这些表,此列不再是唯一的。OP遇到的问题是:在表a中插入id为42的行。在表B中插入另一行外键(42)。从表A中删除id=42。现在重新启动服务器并在tableA中插入另一行。它将得到id=42,tableB中的引用外键现在将指向实际上不存在的数据related@nos:好的,这是有道理的。我无法从问题的描述中找出问题所在,但我现在明白了。不过解决方案很简单:InnoDB支持外键约束,因此当您删除该行时,可以确保没有其他行仍然指向该行。我已经更新了我的答案。有一个独特的约束,这就是它如何失败的原因-它试图在表B中插入一个已经存在的a_ID,因为服务器重新启动,自动增量被重置。看起来很公平。我用它作为收据,但也许我应该采取另一种方法。在MySQL 8.0中修复: