“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>答案 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;