使MySQL自动递增id(重新)从1开始

时间:2010-12-10 14:24:12

标签: php mysql database

  

“BIG”更新:

     

好的,我得到了整体   自动递增点错误。我虽然   这将是一种更容易定位的方式   第一,第二,第三行,   但这只是错误的方法。

     

你应该关心那个   auto_increments很独特,很好......   他们增加了。你应该用   对此。

     

我不会删除这个问题,因为我   认为它可能对某人有帮助   否则有同样错误的想法,但是   警告!:)


我有一个非常简单的MySQL表,它是这样的:

id    comment    user

1     hello      name1
2     bye        name2
3     hola       name3

然后我删除了两个第一条评论,结果:

id    comment    user

3     hola      name3

现在当我添加评论时:

id    comment    user

3     hola      name3
5     chau      name4
6     xxx       name5

我的问题是,每当一行被删除时,我都会需要它“重新开始”,看起来像这样。

id    comment    user

1     hola      name3
2     chau      name4
3     xxx       name5

我想知道如何“重新启动”表格,以便它“始终”被索引为1,2,3等等。

提前致谢!!


我希望我已经清楚地解释了自己,我很抱歉我的所有“普通英语”,如果您认为某个词可能会令人困惑,请随时编辑:)请提出所需的澄清!

顺便说一句:我没有添加任何代码,因为这是一个简化的情况,虽然它更令人困惑,对其他人没有帮助,但我认为这会有所帮助(或有必要)告诉我它! / p>

9 个答案:

答案 0 :(得分:8)

假设没有外键问题需要处理,这段代码将会这样做:

set @id:=0;
update mytable
set id = (@id := @id + 1)
order by id;

如果存在外键问题,请确保在执行更新之前,您的约束定义如下

ALTER CHILD_TABLE ADD CONSTRAINT
FOREIGN KEY MYTABLE_ID REFERENCES MYTABLE
ON UPDATE CASCADE; -- This is the important bit

完成所有操作后,执行此操作以修复auto_increment值:

SELECT MAX(ID) + 1 FROM MYTABLE; -- note the output
ALTER TABLE MYTABLE AUTO_INCREMENT = <result from above>;

答案 1 :(得分:5)

  

免责声明:我无法想到这样做的一个正当理由,它可以打破非常糟糕的事情。但是,为了完整性和演示目的,我添加了这个。

你可以使用这个非常丑陋的解决方案,只有在你处于枪口或你的狗被扣为人质时才能这样做!

-- Create a new veriable.
SET @newId:=0;

-- Set all id's in the table to a new one and
-- also increment the counter in the same step.
-- It's basically just setting id to ++id.
UPDATE
    yourTableHere
SET
    id=@newId:=@newId+1;

-- Now prepare and execute an ALTER TABLE statement
-- which sets the next auto-increment value.
SET @query:=CONCAT("ALTER TABLE yourTableHere AUTO_INCREMENT=", @newId+1);
PREPARE sttmnt FROM @query;            
EXECUTE sttmnt;
DEALLOCATE PREPARE sttmnt;  

这会将所有ID重置为表格中行的位置。请注意,这会将行重新排序为MySQL如何从存储引擎获取它们,因此无法保证订单的任何方式。

如果你有一个基于Ids的系统(比如表之间的关系)那么你就会......好吧,假设我希望你有一个备份。

答案 2 :(得分:3)

使用MySQL的自动增量功能无法完成。你可以推出自己的解决方案,例如应用程序逻辑和数据库触发器之间的混合但是,如果要求您回收UNIQUE ID,那么您的设计会严重破坏。

难道你不能只创建另一个表格来保存这样的引用(这可以通过查询最小值来完成)并让你的主表指向那个辅助表吗?

修改
这是我用Google搜索的一个博客,用于处理您的问题:see here

答案 3 :(得分:1)

这不是AUTO_INCREMENT的目的。存在以生成唯一标识符,而不是维持无间隙序列。

如果您有充分理由想要这样做,请在代码中自行生成标识符。 AUTO_INCREMENT不会为您提供此功能。

答案 4 :(得分:0)

你不应该真的担心这个问题 - 唯一的问题应该是唯一的;它的实际价值应该是无关紧要的。

那就是说here is a way(参见最高评论)做你想做的事。

  

对于那些希望“重置”auto_increment的人,比如在列表上有一些删除并且你想重新编号,你可以执行以下操作。

     

DROP你自动增量的字段。
  改变表格以使用相同的属性再次添加字段。

     

您会注意到所有现有行都重新编号,下一个auto_increment编号将等于行数加1。

     

(请记住,DROPping该列将删除所有现有数据,因此如果您拥有依赖于该数据的外部资源或已存在的数字,您可能会破坏该链接。此外,与任何主要结构一样更改,在进行更改之前备份您的表是个好主意。)

答案 5 :(得分:0)

也许这是你尝试实现的解决方案的方法是不正确的,因为你试图实现的解决方案不可能“自动”并且当你有数千行时手动操作会使你的系统滞后

系统是否真的有必要在每次删除时进行调整?

答案 6 :(得分:0)

无论有多少行,无论如何,都会自动增加自动增量。

ALTER TABLE表AUTO_INCREMENT = 1会重置,但如果ID开始重复,你可能会遇到一些不好的事情。

所以,我的建议是 - 别管它了。)

答案 7 :(得分:0)

ALTER TABLE event AUTO_INCREMENT = 1;

答案 8 :(得分:-1)

 update table_name set id =NULL; alter table table_name change column
 `id` `id` int auto_increment;