【问题标题】:Fixing gaps in mysql table row id after we delete some of them [duplicate]在我们删除其中一些后修复mysql表行ID中的空白[重复]
【发布时间】:2012-03-14 01:26:50
【问题描述】:

我有一个 mysql 表,其中包含超过 17000 行。我已经从其中的一些中间部分删除了大约 530 行。现在每一行都有一个顺序的 AUTO-INCREAMENTED 数字主键。正如您现在可以理解的那样,已删除了几个行数。所以我只想问有没有办法以完美的顺序再次修复所有行?

【问题讨论】:

  • 我只是想知道您为什么需要这样做? id 列中的空白无论如何都很重要,除非您的计数器即将达到限制[嗯,为此您应该开始考虑使用 GUID]。

标签: mysql


【解决方案1】:

您可以但要小心将此主键用作外键的其他表

SET @count = 0;
UPDATE table SET table.id = @count:= @count + 1;

这将更新表tableid 列...然后您需要重置自动增量:

ALTER TABLE table AUTO_INCREMENT = 1;

这会将 MAX(id)+1docs 重置为 MAX(id)+1

更改用于新的 AUTO_INCREMENT 计数器的值 行,这样做:

ALTER TABLE t2 AUTO_INCREMENT = value;  

您不能将计数器重置为小于或等于任何 已经被使用了。对于 MyISAM,如果值小于或等于 到当前在 AUTO_INCREMENT 列中的最大值,该值 重置为当前最大值加一

【讨论】:

  • +1 很棒的 1 班轮查询。我只是想知道为什么有人需要这样做? id 列中的空白无论如何都很重要,除非您的计数器即将达到限制[嗯,为此您应该开始考虑使用 GUID]。
  • 如果id作为外键,该代码可以同时应用于其他表,还有其他风险吗? other tables 对我来说不是问题。
  • ALTER TABLE table AUTO_INCREMENT = 1; 不需要 INNODB。
【解决方案2】:

php 有一个简单的解决方法,我刚刚测试了它。

$count = 0;  
while ($row = mysqli_fetch_array($res)){
         $count++;
mysqli_query($con, "UPDATE table SET id='".$count."' WHERE id='".$row['id']."'"); 
         }

【讨论】:

    猜你喜欢
    • 2013-06-28
    • 2012-10-19
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 2013-09-19
    • 2017-12-15
    • 2023-04-02
    • 2011-07-18
    相关资源
    最近更新 更多