我有一个带有auto_increment字段的表,有时会删除行,因此auto_increment会留下空白。有没有办法避免这种情况,或者如果没有,至少,如何编写一个SQL查询:
auto_increment
值更改为最大值(当前值)+ 1 auto_increment
值?我知道如何编写 1 和 2 部分,但是我可以将它们放在同一个查询中吗?
如果不可能:
如何“选择”(返回)auto_increment
值或auto_increment
值+ 1?
答案 0 :(得分:8)
重新编号会引起混淆。现有报告将引用记录99,但如果系统重新编号,它可能会将该记录重新编号为98,现在所有报告(和填充的UI)都是错误的。一旦你分配了一个唯一的ID,它就必须保持固定。
将ID字段用于除简单唯一编号之外的任何其他内容都会有问题。要求“无间隙”只是与能够删除的要求不一致。也许您可以将记录标记为已删除而不是删除它们。然后真的没有差距。假设您正在生成编号的发票:您将使用该数字取消零值取消发票而不是删除它。
答案 1 :(得分:1)
有一种方法可以在autoinc表中手动插入id。您所要做的就是找出遗失的身份。
但是,不要这样做。如果您的数据库是关系型的,则可能非常危险。删除的ID可能在别处使用。删除后,它不会出现太多问题,也许它会孤立一个记录。如果被替换,则会出现一个巨大的问题,因为存在错误的关系。
考虑一下我有一张汽车表和一张人的表
car
carid
ownerid
name
person
personid
name
并且有一些简单的数据
car
1 1 Van
2 1 Truck
3 2 Car
4 3 Ferrari
5 4 Pinto
person
1 Mike
2 Joe
3 John
4 Steve
现在我删除了John。
person
1 Mike
2 Joe
4 Steve
如果我把一个新人吉姆放到桌子上,并且他得到了一个填补空缺的身份证,那么他最终会得到身份证3
1 Mike
2 Joe
3 Jim
4 Steve
并且通过关系,将成为法拉利的所有者。
答案 2 :(得分:0)
我通常同意此页面上的明智人士(以及duplicate个问题)建议不要重复使用自动增加的ID。这是一个很好的建议,但我不认为由我们决定提出问题的权利或错误,让我们假设开发人员知道他们想做什么以及为什么。
正如Travis J所提到的,答案是,您可以通过在insert语句中包含id列并分配所需的特定值来重用自动增量ID。
以下是将扳手投入使用的要点:MySQL本身(至少5.6 InnoDB)将在以下情况下重用自动增量ID:
插入的行的ID将被计算为max(id)+1,它不从已删除的ID继续。
答案 3 :(得分:0)
正如 djna 在她/他的回答中所说的那样,以这种方式改变数据库表并不是一个好习惯,如果你一直在选择正确的方案和数据类型。顺便提一下你的问题:
我有一个带有auto_increment字段的表,有时会删除行,因此auto_increment会留下空白。有什么方法可以避免这种情况吗?
INSERT
查询id
列只是一个计数器,与数据库中的任何其他列无关,这可能是你(或任何其他寻找此类事物的人)正在寻找的东西:
id
列auto_increment
重新添加
醇>
但是,如果您只想将auto_increment
重置为第一个可用值:
ALTER TABLE `table_name` AUTO_INCREMENT=1
答案 4 :(得分:-1)
不确定这是否有帮助,但在sql server中你可以重新设置标识字段。似乎mySql中有一个ALTER TABLE语句来实现这一点。例如,将ID设置为59446继续。
ALTER TABLE table_name AUTO_INCREMENT = 59446;
我认为您应该能够组合查询以获取auto_increment字段的最大值,然后根据需要使用alter table进行更新。