删除不返回原始数字的行

时间:2013-06-07 20:57:13

标签: php mysql sql phpmyadmin

刚刚使用数据库并且最近完成了一些测试,检查了设置的完整性。

结果,添加了许多测试条目,然后将其删除。但是,添加新条目时,ID号值将在添加条目后继续。

我想要什么: ID在添加其他行之前从中断处增加1: 4203,4204,4205,4206等。

正在发生的事情:  ID从附加行ID后增加1: 4203,4204,6207,6208 6209等。

不知道在哪里解决这个问题......无论是在phpmyadmin还是在PHP代码中。任何帮助,将不胜感激。谢谢!

4 个答案:

答案 0 :(得分:2)

之前我遇到过这个问题,我用phpMyAdmin轻松解决了这个问题。选择数据库,选择表,打开操作选项卡,然后在表选项中将AUTO_INCREMENT设置为1,然后单击GO。这将强制mysql查找最后一个自动递增的值,然后将其直接设置为该值。我手动执行此操作,因为我知道当跳过一行时,它不是来自测试而是删除,因为当我测试并删除行时,我修复了AI值。

答案 1 :(得分:1)

我认为使用自动递增ID键无法实现此目的。 您可以通过将ID分配给(从the_table中选择max(id)+ 1)

来完成

答案 2 :(得分:0)

您可以删除主键然后重新创建它,但这会重新分配所有现有的主键,因此可能会导致关系出现问题(尽管如果主键中没有任何间隙,您可能会侥幸逃脱)。

但我会说你应该接受(并且你的应用应该反映)丢失ID的可能性。例如,在Web应用程序中,如果有人链接到缺少的ID,您会希望404返回不同的记录。

答案 3 :(得分:0)

不需要“重置”id值;我同意有关这个问题的其他意见。

使用AUTO_INCREMENT观察到的行为是设计的;它在MySQL文档中有描述。

尽管如此,我将描述一种方法,您可以使用它来“向下”更改这些行的id值,并使它们全部连续:

作为“踏脚石”的第一步,我们将创建一个查询,其中包含我们需要更改的id值列表,以及我们要更改的建议的新id值它来。此查询使用MySQL用户变量。

假设4203是您要保留的id值,并且您希望将下一个较高的id值重置为4204,则要重置下一个较高的id到4205等。

SELECT s.id
     , @i := @i + 1 AS new_id
  FROM mytable s
  JOIN (SELECT @i := 4203) i
 WHERE s.id > 4203
 ORDER BY s.id 

(注意:在上面的查询中,常量值4203出现两次。)

一旦我们对此查询正常工作感到满意,并返回旧的和新的id值,我们就可以在多表UPDATE语句中将此查询用作内联视图(MySQL将其称为派生表)。我们只是将该查询包装在一组括号中,并为其指定别名,因此我们可以像常规表一样引用它。 (在内联视图中,MySQL实际上将查询返回的结果集实现到MyISAM表中,这可能解释了为什么MySQL将其称为“派生表”。)

这是一个引用派生表的示例UPDATE语句:

UPDATE ( SELECT s.id
              , @i := @i + 1 AS new_id
           FROM mytable s
           JOIN (SELECT @i := 4203) i
          WHERE s.id > 4203
          ORDER BY s.id 
       ) n
  JOIN mytable t
    ON t.id = n.id
   SET t.id = n.new_id
 ORDER BY t.id

请注意,内联视图中的旧id值与现有表中的id值(ON子句)匹配,内联视图生成的“new_id”值将分配给id列(SET条款。)

一旦分配了id值,我们就可以重置表格上的AUTO_INCREMENT值:

ALTER TABLE mytable AUTO_INCREMENT = 1;

注意:这只是一个示例,并提供了一个警告,即重新分配id值不需要这样做。理想情况下,主键值应该是IMMUTABLE,即一旦分配它们就不应该改变。