【问题标题】:how to reuse deleted primary keys in mysql?如何重用mysql中已删除的主键?
【发布时间】:2011-01-18 03:48:48
【问题描述】:

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

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

1、2、3、9、10、30 等等

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

【问题讨论】:

  • 你为什么要这样做?
  • 因为我使用“id”作为行(链接)的名称。所以我不希望这些名字从 5 跳到 23 之间留下一个大洞。
  • 请勿为此使用您的身份。在显示期间命名您的行,这样您就可以将可视行号与内部数据库键分开。
  • @joe:这是出于安全原因?
  • 这不是安全问题。这只是一个非常糟糕的主意。

标签: php mysql


【解决方案1】:

使用 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】:

    使用:

    ALTER TABLE [your table name here] AUTO_INCREMENT = 1
    

    ... 将根据表中现有的最高值将 auto_increment 值重置为下一个值。这意味着它不能用于纠正超过一个的间隙。

    这样做的唯一原因是为了美观 - 数据库不关心记录是否是连续的,只关心它们之间是否始终相关。没有必要为了数据库而“更正”这些值。

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

    【讨论】:

    • 这在测试环境中也很有用。
    【解决方案3】:

    你可以试试 'ALTER TABLE t2 AUTO_INCREMENT = 1;'

    【讨论】:

    • 在 MySQL 4.1 上为我工作,但请参阅我关于它可能不适合预期用途的能力的回答。
    【解决方案4】:

    你有两个选择:

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

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

    【讨论】:

    • 如何手动指定最低 id?你能告诉我它的php代码吗?
    • @noname:就像我在回答中说的那样,您不应该那样做,如果您不想在当您想删除记录而不是实际发出DELETE SQL 语句时,最好在表中设置deleted 标志列。
    • 我使用 id 作为链接名称..所以我希望它不会在数字之间有大的跳跃..我认为手动指定 id 不好。
    猜你喜欢
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 2011-11-19
    • 2012-03-03
    • 2016-09-14
    • 2022-08-14
    • 2020-10-24
    • 2017-03-10
    相关资源
    最近更新 更多