我在mysql表中有一个名为'id'的列,它也是一个自动递增的主键。
当我删除行时,他们的id也将被删除,从而在我的id序列中创建“漏洞”,例如。
1,2,3,9,10,30等
有没有办法重用这些已删除的ID:s?
答案 0 :(得分:10)
使用:
ALTER TABLE [your table name here] AUTO_INCREMENT = 1
...会根据表中现有的最高值将auto_increment值重置为下一个值。这意味着它不能用于纠正不止一个的差距。
执行此操作的唯一原因是化妆品 - 数据库不关心记录是否是连续的,只是它们一致地相互关联。没有必要为数据库“纠正”值。
如果您向用户显示id
值,这就是为什么您希望它们始终是顺序的,那么我建议您添加代理键。使用代理键向用户显示,因此可以根据需要重新排序值,但参考完整性不受影响。在这种情况下,代理键是一个整数列。
答案 1 :(得分:2)
使用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 :(得分:1)
您有两种选择:
TRUNCATE
表格 - 这将删除表格中的所有记录重复使用删除行创建的“漏洞”总是一个坏主意,这已经在此之前得到了解答,但我现在太困了,无法找到这个问题。
答案 3 :(得分:1)
您可以尝试'ALTER TABLE t2 AUTO_INCREMENT = 1;'