防止在服务器重启后重置 Innodb 数据库中的 auto_increment id

Nav*_*mar 11 mysql innodb

我最近读到,由于 InnoDB 在服务器重新启动时如何重新计算 AUTO_INCREMENT 值,ID 列表高端的任何记录可能会重用它们的 ID。

通常,这不是问题,因为当用户被删除时,与该 ID 关联的所有内容也会从其他表中删除。

但我故意将他们的论坛帖子设为孤立,标记为“由 =User #123 = 发布=”,以便保留过去的对话。显然,如果 ID 被重复使用,这将是一个问题。

我以前从未遇到过这个问题,因为总是有足够多的新用户来使 ID 不太可能以这种方式重复使用。然而,在我的新项目中,注册很少,不活跃的用户删除频繁(特别是因为“Open Alpha”帐户仅持续三天作为预览),并且这种 ID 重用现在已经发生了三连三。

我通过在别处保存 AUTO_INCREMENT 的正确值并使用它而不是依赖内部值来“修复”这个问题。有没有一种实际的方法让 InnoDB 记住实际的最后一个值?

ype*_*eᵀᴹ 5

(通过从不删除来避免问题)

由于您希望"Posted by =User #123="在删除用户后保留信息id=123,因此您还可以考虑使用 2 个表来存储用户数据。一种用于Active用户,一种用于所有(包括从活动用户中删除的)。永远不要从AllUser表中删除这些 id :

CREATE TABLE AllUser
( user_id INT AUTO_INCREMENT
, ...
, PRIMARY KEY (user_id)
) ;

------
--- Forum posts FK should reference the `AllUser` table

CREATE TABLE ActiveUser
( user_id INT 
, ...
, PRIMARY KEY (user_id)
, FOREIGN KEY (user_id)
    REFERENCES AllUser (user_id)
) ;

------
--- All other FKs should reference the `ActiveUser` table
Run Code Online (Sandbox Code Playgroud)

这当然会使插入新用户操作复杂化。任何新用户将意味着 2 个插入,每个表中一个。删除用户只能通过从ActiveUser表中删除。除了论坛帖子之外,所有 FK 都将被级联删除,论坛帖子将引用该Alluser表(永远不会发生删除)。


gbn*_*gbn 3

5.5 文档建议将自动增量值存储在其他地方,就像您已经拥有的那样。

另一种解决方案是模拟 SEQUENCE,这样您就不会在实际表本身中使用自动增量。这已经在 SO 上反复讨论过。MySQL性能博客提到了这一点。

这是其他 RDBMS 所没有的另一个 MySQL 数据篡改......