重新排序/重置自动增量主键

Jon*_*han 120 mysql database

我有一个带有自动增量主键的MySQL表.我删除了表中间的一些行.现在我在ID列中有这样的东西:12,13,14,19,20.我删除了15,16,17和18行.

我想重新分配/重置/重新排序主键,以便我有连续性,即使19 a 15,20 a 16,依此类推.

我该怎么做?

Ans*_*hul 340

即使这个问题看起来很旧,也会为在这里搜索到达的人发布答案.

SET @count = 0;
UPDATE `users` SET `users`.`id` = @count:= @count + 1;
Run Code Online (Sandbox Code Playgroud)

如果该列在其他表中用作外键,请确保使用这些表中的外键关系ON UPDATE CASCADE的默认值而不是默认值ON UPDATE NO ACTION.

此外,为了重置AUTO_INCREMENT计数,您可以立即发出以下语句.

ALTER TABLE `users` AUTO_INCREMENT = 1;
Run Code Online (Sandbox Code Playgroud)

对于MySQL,它会将值重置为MAX(id) + 1.

  • @ReverseEMF:不.分配的顺序在MySQL表达式中是固定的.根据您的引用,MySQL文档建议不要多次独立使用该变量.在上面的例子中,表达式的评估必然以预定义的顺序发生,因为单个赋值表达式``users` .id` = @count:= @count + 1`.从文档:"右侧的值可能是文字值,另一个存储值的变量,或任何产生标量值的合法表达式" (3认同)
  • mySQL Doc 建议不要这样做:“作为一般规则,除了在 SET 语句中,您永远不应该为用户变量赋值并在同一语句中读取该值。例如,要增加一个变量,这是可以的:SET @a = @a + 1; 对于其他的语句,比如SELECT,可能会得到你期望的结果,但这不能保证。第二个:SELECT @a, @a:=@a+1, ...; 但是,涉及用户变量的表达式的计算顺序是未定义的。” (2认同)

Tom*_*igh 87

您可以删除主键列并重新创建它.然后应按顺序重新分配所有ID.

然而,在大多数情况下,这可能是一个坏主意.如果你有其他表有这个表的外键,那么它肯定不会工作.

  • 如果你尝试开始接受你的ID并不总是顺序的话,这可能是最好的长期,否则当你开始处理更大的项目时,它真的会疯狂! (62认同)
  • ALTER TABLE your_table AUTO_INCREMENT = 1 (4认同)

Rya*_*yan 55

要重置我的User表的ID,我使用以下SQL查询.上面已经说过,这将破坏你与任何其他表格之间的任何关系.

ALTER TABLE `users` DROP `id`;
ALTER TABLE `users` AUTO_INCREMENT = 1;
ALTER TABLE `users` ADD `id` int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
Run Code Online (Sandbox Code Playgroud)

  • 如果我有100票,我会一直投票,因为它打破了像我一样的noob的sql语句,这有助于理解 (3认同)
  • 第二行是不必要的还是我错了?它本身以 1 开头,,,, 对于 InnoDB 它对我来说是这样 (2认同)

小智 30

您可以简单地使用此查询

alter table abc auto_increment = 1;
Run Code Online (Sandbox Code Playgroud)

  • @Ireeder从5.6开始对innodb的行为类似于myisam的行为 (3认同)
  • 在这种情况下这不起作用。对于 ISAM 表,它会将 autoinc 值设置为 max(id) + 1。对于 InnoDB,它什么都不做。请参阅更改表文档以更改 AUTOINCREMENT http://dev.mysql.com/doc/refman/5.0/en/alter-table.html (2认同)

小智 14

SET  @num := 0;

UPDATE your_table SET id = @num := (@num+1);

ALTER TABLE your_table AUTO_INCREMENT =1;
Run Code Online (Sandbox Code Playgroud)

我想这会做到的


lbr*_*tti 12

或者,从PhpMyAdmin中删除"AutoIncrement"标志,保存,再次设置并保存.这会重置它.


Shu*_*lik 7

SELECT * from `user` ORDER BY `user_id`; 

SET @count = 0;

UPDATE `user`  SET `user_id` = @count:= @count + 1;

ALTER TABLE `user_id` AUTO_INCREMENT = 1;
Run Code Online (Sandbox Code Playgroud)

如果你想order by