如何重置MySQL中的AUTO_INCREMENT?

hom*_*rrr 1174 mysql sql auto-increment

我怎样才能重新AUTO_INCREMENT一个领域?我希望它1再次开始计数.

Nie*_*els 1903

您可以使用以下命令重置计数器

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

对于InnoDB,您无法将该auto_increment值设置为低于或等于当前最高索引.(引自ViralPatel):

请注意,您不能将计数器重置为小于或等于任何已使用的值.对于MyISAM,如果该值小于或等于AUTO_INCREMENT列中当前的最大值,则该值将重置为当前最大值加1.对于InnoDB,如果该值小于列中的当前最大值,则不会发生错误,并且不会更改当前序列值.

请参阅如何使用另一个表中的MAX值重置MySQL AutoIncrement?关于如何动态获得可接受的值.

  • 请记住,MySql将创建一个具有相同结构和新auto_increment值的新表,并复制原始表中的所有记录,删除原始表并重命名新表.如果表很大,这可能会对生产环境产生相当大的性能影响(和磁盘空间). (71认同)
  • 这是一个"循环引用" (52认同)
  • 对于填满的表格,这可能需要永远.小心这个:http://stackoverflow.com/questions/2681869/while-reseting-auto-increment-for-a-particular-table-query-is-taking-long-time (8认同)
  • @Rostol这个问题即使在今天(2021年使用MySQL 8+)仍然存在吗?我发现即使对于大型表,重置 AUTO_INCRMENT 也是即时的。我有点需要重置功能,因为我有 ON DUPLICATE KEY UPDATE 查询,每次运行时都会不必要地增加计数器。 (8认同)
  • 如果您已经拥有AUTOINCREMENT列,这个高度投票的答案真的有用吗?根据MySQL 5.1文档:"你不能将计数器重置为小于或等于任何已经使用过的值.对于MyISAM,如果该值小于或等于AUTO_INCREMENT列中当前的最大值,值被重置为当前最大值加1.对于InnoDB,如果该值小于列中的当前最大值,则不会发生错误,并且不会更改当前序列值." 听起来如果自动增量大于1则不会发生任何事情. (5认同)
  • "curcular reference"是什么意思? (4认同)
  • 使用TRUNCATE MY_TABLE删除表中的所有数据并将AI重置为1。 (2认同)

boo*_*biq 148

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

  • 就个人而言,我认为这两个对AUTO_INCREMENT问题的答案都有并发冲突是一件好事:-) (64认同)
  • @PraveenSrinivasan没有区别,我们同时添加了它们 (25认同)
  • 我可以知道你的答案与之前的答案有什么区别 (6认同)

ngh*_*pit 73

SET  @num := 0;

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

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

我想这会做到的

  • 这个问题已经有了适当的答案.此外,您的`UPDATE`将更新`id`列中的所有值. (2认同)

fyr*_*fyr 55

就像这样:

ALTER TABLE tablename AUTO_INCREMENT = value;
Run Code Online (Sandbox Code Playgroud)

参考:http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

  • `reset`表示将其设置为默认值...因此您可以将"value"替换为1 (4认同)

Mil*_* M. 38

在此输入图像描述在"操作"选项卡下有一个非常简单的phpmyadmin方法,您可以在表格选项中设置自动增量到您想要的数字.

  • 这对于innodb引擎不起作用 (2认同)

tru*_*rds 34

对我有用的最佳解决方案:

ALTER TABLE my_table MODIFY COLUMN ID INT(10) UNSIGNED;
COMMIT;
ALTER TABLE my_table MODIFY COLUMN ID INT(10) UNSIGNED AUTO_INCREMENT;
COMMIT;
Run Code Online (Sandbox Code Playgroud)

它速度快,适用于innoDB,我不需要知道当前的最大值!这样,自动增量计数器将重置,它将从存在的最大值自动启动.


小智 19

如何重置MySQL自动增量列中给出了很好的选项

请注意,ALTER TABLE tablename AUTO_INCREMENT = value;没有对InnoDB的工作

  • 你是如何用InnoDB做的? (8认同)
  • 它确实适用于InnoDB,至少在MySQL 5.1.73上. (5认同)
  • 使用MySQL v 5.6.2对我很好 (4认同)

lre*_*der 19

这个问题的最高评分答案都建议"ALTER yourtable AUTO_INCREMENT = value".但是,这仅value在alter大于自动增量列的当前最大值时才有效. 根据MySQL文档:

您不能将计数器重置为小于或等于任何已使用的值.对于MyISAM,如果该值小于或等于AUTO_INCREMENT列中当前的最大值,则该值将重置为当前最大值加1.对于InnoDB,您可以使用ALTER TABLE ... AUTO_INCREMENT =从MySQL 5.0.3开始的值,但如果该值小于列中的当前最大值,则不会发生错误,并且不会更改当前序列值.

实质上,您只能改变AUTO_INCREMENT以增加自动增量列的值,而不是将其重置为1,因为OP在问题的第二部分中提出了问题.对于实际允许您将AUTO_INCREMENT从其当前最大值向下设置的选项,请查看重新排序/重置自动增量主键.


Sea*_*anN 18

添加更新,因为MySQL 5.6中的功能已更改.从MySQL 5.6开始,您可以使用带InnoDB的简单ALTER TABLE:

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

更新文档以反映这一点:

http://dev.mysql.com/doc/refman/5.6/en/alter-table.html

我的测试还显示表没有被复制,只是改变了值.


Ali*_*van 12

ALTER TABLE news_feed DROP id

ALTER TABLE news_feed ADD  id BIGINT( 200 ) NOT NULL AUTO_INCREMENT FIRST ,ADD PRIMARY KEY (id)
Run Code Online (Sandbox Code Playgroud)

我在我的一些脚本中使用了这个,id字段被droped然后添加回以前的设置,数据库表中的所有现有字段都填入了新的自动增量值,这也适用于InnoDB.

请注意,表中的所有字段都将被重新计算,并且将包含其他ID !!!

  • 我想要这样的东西!但作为额外警告; 这显然会彻底打破你的外键. (2认同)

Man*_*mar 12

您还可以使用如下语法TRUNCATE表: TRUNCATE TABLE table_name

谨防!! TRUNCATE TABLE your_table删除你的一切your_table !!

  • **新程序员**,请注意`TRUNCATE`也会_delete指定表中的所有rows_! (12认同)

小智 10

更新到最新的加一id:

 ALTER TABLE table_name AUTO_INCREMENT = 
 (SELECT (id+1) id FROM table_name order by id desc limit 1);
Run Code Online (Sandbox Code Playgroud)

编辑:

SET @latestId = SELECT MAX(id) FROM table_name;
SET @nextId = @latestId + 1;
ALTER TABLE table_name AUTO_INCREMENT = @nextId;
Run Code Online (Sandbox Code Playgroud)

未经测试,请在运行前测试*


小智 8

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


Mih*_*lan 8

SET @num := 0;
UPDATE your_table SET id = @num := (@num+1);
ALTER TABLE your_table AUTO_INCREMENT =1;
Run Code Online (Sandbox Code Playgroud)


小智 7

从 MySQL 5.6 开始,由于在线 DDL,以下方法的运行速度更快(注意algorithm=inplace):

alter table tablename auto_increment=1, algorithm=inplace;


Abd*_*yir 6

它用于空表:

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

如果您有数据但想要整理一下,我建议使用此方法:

ALTER TABLE `table_name` DROP `auto_colmn`;
ALTER TABLE `table_name` ADD  `auto_colmn` INT( {many you want} ) NOT NULL AUTO_INCREMENT FIRST ,ADD PRIMARY KEY (`auto_colmn`);
Run Code Online (Sandbox Code Playgroud)


bda*_*ina 5

这是我的解决方案,但如果您的列有约束或作为外键连接到其他表,我不建议这样做,因为它会产生不良影响甚至不起作用。

第一:删除列

ALTER TABLE tbl_name DROP COLUMN column_id
Run Code Online (Sandbox Code Playgroud)

第二:如果您希望将其作为我假设的第一列,则重新创建该列并将其设置为 FIRST。

ALTER TABLE tbl_access ADD COLUMN `access_id` int(10) NOT NULL PRIMARY KEY AUTO_INCREMENT FIRST
Run Code Online (Sandbox Code Playgroud)

这很好用!