刚刚使用数据库并且最近完成了一些测试,检查了设置的完整性。
结果,添加了许多测试条目,然后将其删除。但是,添加新条目时,ID号值将在添加条目后继续。
我想要什么: ID在添加其他行之前从中断处增加1: 4203,4204,4205,4206等。
正在发生的事情: ID从附加行ID后增加1: 4203,4204,6207,6208 6209等。
不知道在哪里解决这个问题......无论是在phpmyadmin还是在PHP代码中。任何帮助,将不胜感激。谢谢!
答案 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,即一旦分配它们就不应该改变。