我最近读到,由于 InnoDB 在服务器重新启动时如何重新计算 AUTO_INCREMENT 值,ID 列表高端的任何记录可能会重用它们的 ID。
通常,这不是问题,因为当用户被删除时,与该 ID 关联的所有内容也会从其他表中删除。
但我故意将他们的论坛帖子设为孤立,标记为“由 =User #123 = 发布=”,以便保留过去的对话。显然,如果 ID 被重复使用,这将是一个问题。
我以前从未遇到过这个问题,因为总是有足够多的新用户来使 ID 不太可能以这种方式重复使用。然而,在我的新项目中,注册很少,不活跃的用户删除频繁(特别是因为“Open Alpha”帐户仅持续三天作为预览),并且这种 ID 重用现在已经发生了三连三。
我通过在别处保存 AUTO_INCREMENT 的正确值并使用它而不是依赖内部值来“修复”这个问题。有没有一种实际的方法让 InnoDB 记住实际的最后一个值?
(通过从不删除来避免问题)
由于您希望"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表(永远不会发生删除)。