问题 如何在mysql中重用已删除的主键?


我在mysql表中有一个名为'id'的列,它也是一个自动递增的主键。

当我删除行时,他们的id也将被删除,从而在我的id序列中创建“洞”,例如。

1,2,3,9,10,30等

有没有办法重用这些已删除的ID:s?


11705
2018-02-18 02:32


起源

你为什么想做这个? - Daniel A. White
因为我使用'id'作为行(链接)的名称。所以我不想要这些名字,例如从5跳到23,留下一个大洞。 - ajsie
不要使用您的身份。在显示期间命名行,这样就可以将可视行号与内部数据库键分开。 - Joe
@joe:这是出于安全原因? - ajsie
这不是安全问题。这只是一个非常糟糕的主意。 - Dolph


答案:


使用:

ALTER TABLE [your table name here] AUTO_INCREMENT = 1

...将基于表中现有的最高值将auto_increment值重置为下一个值。这意味着它不能用于纠正不止一个的差距。

这样做的唯一原因是化妆品 - 数据库并不关心记录是否是连续的,只是它们一致地相互关联。没有必要为数据库“纠正”值。

如果你正在显示 id 对用户的价值,这就是为什么你希望它们始终是顺序的,那么我建议你添加一个代理键。使用代理键向用户显示,因此可以根据需要重新排序值,但参考完整性不受影响。在这种情况下,代理键是整数列。


10
2018-02-18 02:49



这在测试环境中也很有用。 - Michael


使用bash脚本重命名它们(如果你有一个大型数据库,这是非常慢和低效的)然后在你完成之后,如前所述使用ALTER TABLE重置下一个要使用的密钥

TARGET=1
for KEYS in `mysql --skip-column-names -u root --password=Password -D lookup -e "select id from tbl"` ; do
  mysql --skip-column-names -u root --password=Password -D lookup -e "update tbl set id='$TARGET' where id = '$KEYS'"
  TARGET=`expr $TARGET + 1`
  echo $TARGET
done

2
2017-11-20 05:49





你有两个选择:

  1. 手动指定ID(这会从自动增量中删除auto)
  2. TRUNCATE 表 - 这将删除表中的所有记录

重复使用删除行创建的“漏洞”总是一个坏主意,这已经在此之前得到了回答,但我现在太困了,无法找到那个问题。


1
2018-02-18 02:36



我怎么能手动指定最低ID?你可以告诉我它的PHP代码吗? - ajsie
@noname:就像我在答案中说的那样,你不应该这样做,你提到的“漏洞”存在以确保数据(关系)的完整性,如果你不想在你的表中有间隙你会更好地设置一个 deleted 当您要删除记录而不是实际发出记录时,在表中标记列 DELETE SQL语句。 - Alix Axel
我使用id作为链接名称。所以我希望它不要在数字之间有大的跳跃。我认为不好手动指定id。 - ajsie


您可以尝试'ALTER TABLE t2 AUTO_INCREMENT = 1;'


1
2018-02-18 02:36



在MySQL 4.1上为我工作,但请看我的答案,它的能力可能不符合预期的用途。 - OMG Ponies