Php 如何重新使用任何MySQL DB表中删除的id?

Php 如何重新使用任何MySQL DB表中删除的id?,php,mysql,Php,Mysql,如何重新使用任何MySQL DB表中删除的id 如果我想回滚已删除的ID,我们是否可以这样做?可以通过查找最低的未使用ID并强制执行它,但这是一种非常糟糕的做法,主要是因为引用完整性:例如,可能是来自其他表的关系指向已删除的记录,而该记录无法识别为“已删除”如果ID被重用,就不会有任何问题 底线:不要这样做。这真是个坏主意 相关阅读: 更新:即使你有合法的理由这样做,我也不认为有一种自动的方法可以重复使用自动增量字段中的值。如果有的话,您必须找到最低的未使用值(可能使用存储过程或外部脚本),并强

如何重新使用任何MySQL DB表中删除的id


如果我想回滚已删除的ID,我们是否可以这样做?

可以通过查找最低的未使用ID并强制执行它,但这是一种非常糟糕的做法,主要是因为引用完整性:例如,可能是来自其他表的关系指向已删除的记录,而该记录无法识别为“已删除”如果ID被重用,就不会有任何问题

底线:不要这样做。这真是个坏主意

相关阅读:

更新:即使你有合法的理由这样做,我也不认为有一种自动的方法可以重复使用
自动增量
字段中的值。如果有的话,您必须找到最低的未使用值(可能使用存储过程或外部脚本),并强制将其作为ID(如果可能的话)

你不应该这样做。
根本不要把它当作一个数字。
这不是一个数字。它是唯一的标识符。想想这个词——独一无二。不应使用相同id标识任何记录。

1


根据您提供的解释“@Pekka,我正在跟踪INsert-Update和delete查询…”我假设您只是想知道如何将旧数据恢复到相同的ID

在这种情况下,您可以考虑在表中使用删除标志列。

如果删除标记设置为某行,则应考虑程序删除它。此外,您可以通过设置delete flat(假)使其可用

类似的方法是将整行移动到某个临时表中,并在需要时使用相同的数据和ID将其带回来

上。不过这个主意更好

二,

如果这不是你解释的意思;并且您想要删除并且仍然使用ID(自动生成)的所有值;我有一些想法你可以实施: -创建用于存储已删除ID的表(IDSTORE)。 -创建一个在行删除时激活的触发器,该触发器将记录ID并将其存储到表中。 -插入时,从IDSTORE中获取最小ID并将其与该值一起插入。如果IDSTORE为空,则可以传递NULL ID以生成自动递增的数字

当然,如果您实现了引用/关系(FK),您必须手动处理它,因为您的需求是如此

进一步案文:

以下是我的mysql数据库案例:

我有一个菜单表,菜单id在内容表中用作外键。但是表之间没有直接的关系(我知道表设计很糟糕,但是项目是由其他开发人员完成的,后来我的客户找我来处理)。因此,有一天我的客户意识到一些内容没有显示出来。我查看了这个问题,发现其中一个菜单已从菜单表中删除,但幸运的是,该菜单id存在于Coent表中。我从已删除的内容表中找到了菜单id,并对具有相同菜单id的菜单表以及其他字段运行正常的插入查询。(Id是主键)并且工作正常

insert into tbl_menu(id, col1, col2, ...) values(12, val1, val2, ...)

为什么要重用ID?这样我就可以重新插入旧数据,而不影响任何其他进程。只需回滚一个事务,然后再使用相同的穷人跟踪系统。如果希望能够“重新插入”数据,请不要删除它。在表中添加“已删除”列,并在其中插入删除日期。当你想恢复数据时,你只需将字段设为空。@Pekka我有这样一种情况:如果我通过删除前一个数据来测试我的数据,但它对我不起作用,但现在我必须使用相同的旧ID重新使用旧数据,那又怎么样?@Parth我不理解你的情况,但是如果你不得不重用旧的ID,你很可能在某个地方有设计缺陷。你能详细说明一下你的问题吗?@Pekka,我正在跟踪表中的插入更新和删除查询,我在插入和更新方面做得很好,因为我在那里没有遇到任何ID问题,但一旦执行删除操作,我就失去了可能在许多地方使用的唯一ID,重新插入旧数据将得到新ID而不是旧ID,因此,对于这种情况,我需要旧ID,这样我就可以用相同的旧ID在其他数据库中复制查询,只需查看他的问题历史记录。我是全面的解释。@Parth不完全是诚实的-如果你删除了一条记录,为什么与该记录的关系仍然存在?无论如何,正如我所说的,单用mySQL是很难做到的。我想,你必须用你选择的脚本语言编写一些东西。@U上校可以把我命名为“数据跟踪器”:)同意。这不像是一个分散的驱动器,如果分散,效率会降低。只要id的数据类型能够处理这些值,就不用担心了。如果无法处理这些值,请获取一个新的数据类型。@Parth如果您的ID当前是无符号整数,并且您接近4294967295条记录,请升级到无符号BIGINT(直到您有18446744073709551615条记录)。@Parth SERIAL成为BIGINT无符号非空自动增量唯一的有用别名。