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

Tru*_*ufa 7 php mysql database

"大"更新:

好吧,我得到了整个自动增量点错误.我虽然这将是一个更容易的方法来定位第一,第二,第三等行,但这只是错误的方法.

你应该关心auto_increments是唯一的,并且它们会增加.你应该使用那个.

我不会删除这个问题,因为我认为对于有同样错误想法的其他人可能会有所帮助,但是要警告!:)


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

id    comment    user

1     hello      name1
2     bye        name2
3     hola       name3
Run Code Online (Sandbox Code Playgroud)

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

id    comment    user

3     hola      name3
Run Code Online (Sandbox Code Playgroud)

所以现在当我添加评论时:

id    comment    user

3     hola      name3
5     chau      name4
6     xxx       name5
Run Code Online (Sandbox Code Playgroud)

我的问题是,我需要每当一行被删除时,它应该"重新开始",看起来像这样.

id    comment    user

1     hola      name3
2     chau      name4
3     xxx       name5
Run Code Online (Sandbox Code Playgroud)

我想知道如何"重新启动"表,以便"始终"索引1,2,3等等.

提前致谢!!


我希望我已经清楚地解释了自己,我很抱歉所有的"普通英语",如果你认为一个词可能会令人困惑,请随时编辑:)请询问任何需要澄清的内容!

顺便说一句:我没有添加任何代码,因为这是一个简化的情况,虽然它更混乱,对其他人帮助不大,但我认为这有助于(或有必要)告诉我它!

Boh*_*ian 8

假设没有外键问题需要处理,这段代码将执行此操作:

set @id:=0;
update mytable
set id = (@id := @id + 1)
order by id;
Run Code Online (Sandbox Code Playgroud)

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

ALTER CHILD_TABLE ADD CONSTRAINT
FOREIGN KEY MYTABLE_ID REFERENCES MYTABLE
ON UPDATE CASCADE; -- This is the important bit
Run Code Online (Sandbox Code Playgroud)

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

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


Bob*_*bby 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;  
Run Code Online (Sandbox Code Playgroud)

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

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


aef*_*fxx 2

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

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

编辑
这是我在谷歌上搜索到的一个博客,可以解决您的问题:请参阅此处