Mysql 如何保持标识列连续无间隔?

Mysql 如何保持标识列连续无间隔?,mysql,sql,Mysql,Sql,我有一个记录为M+2的数据库,问题是:我必须删除大约10000个,现在我遇到了这个问题,ID将丢失,例如 ID: 100 ID: 102 ID: 103 ... 如何组织?也就是说,用这个替换没有“孔”的所有后续ID?请记住,我有超过200万条记录(每天超过15000条),手动操作是不可行的 我需要: ID: 101 ID: 102 ID: 103 ... 不要填补空白。对现有行重新编号是一个非常糟糕的主意,尤其是当它是PK字段时。例如,想想如果有一天他们决定社会保险号码必须是连续的,那么当

我有一个记录为M+2的数据库,问题是:我必须删除大约10000个,现在我遇到了这个问题,ID将丢失,例如

ID: 100
ID: 102
ID: 103
...
如何组织?也就是说,用这个替换没有“孔”的所有后续ID?请记住,我有超过200万条记录(每天超过15000条),手动操作是不可行的

我需要:

ID: 101
ID: 102
ID: 103
...

不要填补空白。对现有行重新编号是一个非常糟糕的主意,尤其是当它是PK字段时。例如,想想如果有一天他们决定社会保险号码必须是连续的,那么当人们死亡时,他们会把所有号码都调低以填补空白,这会造成混乱。所以你会得到一个经常变化的身份证号码,这个号码过去属于其他人

对于一个好的代理键,实际值应该没有任何意义,因此间隙也没有任何意义

如果这是您主要关心的问题,为什么不添加isDeleted位字段和标志记录,而不是实际删除它们呢。瞧,没有空隙


如果您绝对必须有一个递增的数字(如行号),那么您就不必麻烦维护它

不要填补空白。对现有行重新编号是一个非常糟糕的主意,尤其是当它是PK字段时。例如,想想如果有一天他们决定社会保险号码必须是连续的,那么当人们死亡时,他们会把所有号码都调低以填补空白,这会造成混乱。所以你会得到一个经常变化的身份证号码,这个号码过去属于其他人

对于一个好的代理键,实际值应该没有任何意义,因此间隙也没有任何意义

如果这是您主要关心的问题,为什么不添加isDeleted位字段和标志记录,而不是实际删除它们呢。瞧,没有空隙


如果您绝对必须有一个递增的数字(如行号),那么您就不必麻烦维护它

您可能会发现,将所有记录存储在源表中,然后在确定哪些记录符合条件后,将其插入辅助表中。这通常非常简单:

INSERT INTO b_table (a, b, c) SELECT a, b, c FROM a_table

如果您有一个自动递增的ID字段,您只需将其从两侧删除,它将在
b_table
侧按顺序重新创建,没有间隙。如果愿意,您可以在处理完记录后从
表中清除记录。

您可能会发现将所有记录存储在源表中,然后在确定哪些记录符合条件后将其插入辅助表中。这通常非常简单:

INSERT INTO b_table (a, b, c) SELECT a, b, c FROM a_table

如果您有一个自动递增的ID字段,您只需将其从两侧删除,它将在
b_table
侧按顺序重新创建,没有间隙。如果愿意,可以在处理完记录后从
表中清除记录。

这个问题经常被问到。试图填补空白通常不是一个好主意,因为它可能会破坏其他地方的引用完整性。auto_increment id通常不是一个重要的列,因此实际上是否存在间隙并不重要。例如,您不应该使用id查看您有多少条记录。您想删除“漏洞”的原因是什么?保持身份证不变。这不会引起任何问题。我希望它们按顺序排列,作为参考资料没有问题。尼克(正确地)问的是原因是什么。可能是因为这个问题经常出现,原因通常只是为了迎合某些人的强迫症倾向。所以我再问一遍。你有什么商业理由来确保它们是连续的?这个问题经常被问到。试图填补空白通常不是一个好主意,因为它可能会破坏其他地方的引用完整性。auto_increment id通常不是一个重要的列,因此实际上是否存在间隙并不重要。例如,您不应该使用id查看您有多少条记录。您想删除“漏洞”的原因是什么?保持身份证不变。这不会引起任何问题。我希望它们按顺序排列,作为参考资料没有问题。尼克(正确地)问的是原因是什么。可能是因为这个问题经常出现,原因通常只是为了迎合某些人的强迫症倾向。所以我再问一遍。您有什么商业理由来确保它们是连续的?也许将其称为
removed
作为布尔字段比
isDelete
更好,因为后者没有多大意义。使用反向也是可能的,例如有一个
可见的
标志,默认为true,如果“删除”,则为false。我认为理论是一样的。他给这个字段起什么名字,或者是真是假=删除,其实都无关紧要。也许把它称为布尔字段比称为isDelete要好,因为后者没有多大意义。使用反向也是可能的,例如有一个
可见的
标志,默认为true,如果“删除”,则为false。我认为理论是一样的。他给字段起什么名字,或者是真是假=删除,其实都无关紧要。