如何在MySQL中重置AUTO_INCREMENT?


1244

我怎样才能重新AUTO_INCREMENT一个领域?
我希望它从头开始计算1



80
您可能也想清空桌子:TRUNCATE TABLE yourTableName;
Konerak 2012年


3
是的,在这种情况下,最好使用截断表。它还会将自动增量开始重置为
1。– raidsan

2
有时您没有TRUNCATE的权限,因为这需要DROP权限。
路加·考辛斯

Answers:


2024

您可以使用以下方法重置计数器:

ALTER TABLE tablename AUTO_INCREMENT = 1

对于InnoDB,您不能将auto_increment值设置为小于或等于当前最大索引。(引自ViralPatel):

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

请参见如何使用另一个表中的MAX值重置MySQL自动增量?如何动态获得可接受的值。


8
这可能永远占用一张已满的桌子。小心这一点:stackoverflow.com/questions/2681869/...
BT

52
这是circular reference
Besnik

5
你是什么意思curcular reference
Niels,

73
请记住,MySql将创建一个具有相同结构和新auto_increment值的新表,并复制原始表中的所有记录,删除原始表并重命名新表。如果表很大,这可能会对生产环境产生相当大的性能影响(和磁盘空间)。
罗斯托尔2013年

6
如果您已经有一个AUTOINCREMENT列,那么这个投票很高的答案真的有用吗?根据MySQL 5.1文档:“您不能将计数器重置为小于或等于已使用的值。对于MyISAM,如果该值小于或等于当前AUTO_INCREMENT列中的最大值,则值重置为当前最大值加1。对于InnoDB,如果该值小于列中的当前最大值,则不会发生错误,并且当前序列值不会更改。” 像什么声音会在这里,如果自动增量大于1的发生
lreeder


81
SET  @num := 0;

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

ALTER TABLE your_table AUTO_INCREMENT =1;

我认为这可以做到


2
这个问题已经有一个适当的答案。此外,您UPDATE将更新id列中的所有值。
2014年

2
OP并未声明它们正在对现有行进行重新排序。
柯米特2014年

完整而完美的答案。但是我怀疑,当我们插入一个新值时,该值的PK是多少。是1还是下一个PK?
2017年

是的,这是最好的解决方案,但是如果要写入数据(例如生产表),则可能要锁定表
wavvves

非常有帮助,我有相同的要求,我必须将自动增量重置为以1开始,只有前两个命令有所帮助。
LOKENDRA


40

在此处输入图片说明使用phpmyadmin的“操作”标签下有一种非常简单的方法,您可以在表选项中将自动递增设置为所需的数字。


之后,您需要立即重启mysql服务/服务器。
网络”

1
我认为您此后无需重新启动服务器。PhpAdmin将只运行命令以更改增量起点。
卡里姆

您无需重新启动,它将从下一次插入开始生效。
IlludiumPu36

36

最适合我的解决方案:

ALTER TABLE my_table MODIFY COLUMN ID INT(10) UNSIGNED;
COMMIT;
ALTER TABLE my_table MODIFY COLUMN ID INT(10) UNSIGNED AUTO_INCREMENT;
COMMIT;

它的速度很快,可与innoDB一起使用,并且我不需要知道当前的最大值!这样,自动增量计数器将复位,并从存在的最大值开始自动启动。


1
它将在information_schema上设置NULL auto-inc值;检查SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'my_table' AND table_schema = DATABASE( ) ;
K-Gun

1
我在5.6.x版上进行了测试,效果很好,并且KeremGüneş的查询返回了最大值加一,而不是声明的null。(也许在第一个查询后将其设置为null,但在第二个查询后未将其设置为空)我相信这是InnoDB的最佳解决方案。
Frank Forte

与设置显式值相同:“创建一个具有相同结构和新auto_increment值的新表,并复制原始表中的所有记录,删除原始表并重命名新表。这可能会对性能(和磁盘空间)产生重大影响在生产环境中,如果桌子很大。” 但更糟糕的是,因为需要两次完整的复制表。
Enyby

我确认这个工程的版本5.6.15,而ALTER TABLE tablename AUTO_INCREMENT = 1不会没有

24

这个问题的最高评分答案都建议“ ALTER yourtable AUTO_INCREMENT = value”。但是,这仅value在alter中的值大于autoincrement列的当前最大值时才有效。 根据MySQL 8文档

您不能将计数器重置为小于或等于当前使用的值。对于InnoDB和MyISAM,如果该值小于或等于AUTO_INCREMENT列中当前的最大值,则该值将重置为当前的最大AUTO_INCREMENT列值加1。

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


20

由于功能在MySQL 5.6中已更改,因此添加了更新。从MySQL 5.6开始,您可以在InnoDB中使用简单的ALTER TABLE:

ALTER TABLE tablename AUTO_INCREMENT = 1;

文档已更新以反映此情况:

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

我的测试还显示该表未复制,仅更改了值。


19

如何重置MySQL自动增量列中提供了不错的选择

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


8
您如何使用InnoDB做到这一点?
–EmptyArsenal

4
使用MySQL v 5.6.2
Eddie B

我有一个类似的问题,在我从表中删除记录后,自动递增字段没有重置。TRUNCATE似乎有效。我认为以下用于删除自动增量然后重新应用的解决方案可能有助于缓解这种情况。
Craig Maloney 2015年

@CraigMaloney- DELETE(或ROLLBACK)将无法恢复ID。一个例外:重新启动(或崩溃)后,下一个id计算为MAX(id)+1,从而有效地恢复end上已删除的id 。例外情况:MySQL 8.0保留未使用的ID。
里克·詹姆斯

12
ALTER TABLE news_feed DROP id

ALTER TABLE news_feed ADD  id BIGINT( 200 ) NOT NULL AUTO_INCREMENT FIRST ,ADD PRIMARY KEY (id)

我在一些脚本中使用了此功能,首先删除了id字段,然后使用以前的设置将其添加回去,数据库表中所有现有的字段都填充了新的自动增量值,这也应与InnoDB一起使用。

请注意,表中的所有字段将被重新计数,并将具有其他ID !!!。


3
我想要这样的东西!但作为额外的警告;这显然会完全破坏您的外键。
NoobishPro

12

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

谨防!! TRUNCATE TABLE your_table删除所有的内容your_table


14
新程序员,请注意,这TRUNCATE也会删除指定表中的所有行
Zanshin13年

1
上面的评论应该插入答案中,或者至少是有关截断实际使用的解释。
2015年

TRUNCATE也会重置auto_increment字段吗?我的用例是清除表中的数据,然后为数据从1重新开始ID (想象一下,在测试完成后清除表以正确使用)。我以为我得DROP整桌CREATE再坐。
ADTC '16

是的,TRUNCATE的工作方式就像在桌子上进行重置一样。如果自创建表以来已经更改了表,那将不完全正确,那么这些更改将不会被重置。我认为它更接近于导出表结构,并使用导出来创建新表,而不是实际的重置。
克里斯(Chris

是的@ADTC。如果要保留当前auto_increment值,请使用DELETE FROM代替TRUNCATE
TRiG

8

它用于空表:

ALTER TABLE `table_name` AUTO_INCREMENT = 1;

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

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`);


这为我们处理了数据。它将行重置为下一个索引。谢谢!


5

这是我的解决方案,但是如果您的列有约束或作为外键连接到其他表,我将不建议这样做,因为这可能会导致不良影响甚至无法正常工作。

>首先:删除列

ALTER TABLE tbl_name DROP COLUMN column_id

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

ALTER TABLE tbl_access ADD COLUMN `access_id` int(10) NOT NULL PRIMARY KEY AUTO_INCREMENT FIRST

这很好用!


3

从MySQL 5.6开始,以下方法由于在线DDL(注释algorithm=inplace)而工作更快:

alter table tablename auto_increment=1, algorithm=inplace;


2

您可以简单地截断表以重置序列

TRUNCATE TABLE TABLE_NAME

1

我试图更改表并将auto_increment设置为1,但是它不起作用。我决定删除要递增的列名,然后使用您的首选名称创建一个新列,并将该新列设置为从一开始就递增。


你能解释一下你是如何做到的吗?
MZaragoza

@MZaragoza只需删除没有AI的旧列,然后创建一个启用AI的新列。
-andromeda

您能否更新您的答案以显示此信息。我真的很感激
萨拉戈萨省

1

可以通过两种方式来(重新)设置表的自动递增计数器:

  1. 通过执行查询,就像已经解释的其他查询一样:

    ALTER TABLE <table_name> AUTO_INCREMENT=<table_id>;

  2. 使用Workbench或其他可视数据库设计工具。我将在Workbench中展示它是如何完成的-但在其他工具中也应该没有太大不同。右键单击所需的表,然后Alter table从上下文菜单中选择。在底部,您可以看到用于更改表格的所有可用选项。选择Options,您将获得此表格: 在此处输入图片说明

    然后Auto increment,如图所示,在字段中设置所需的值。这基本上将执行第一个选项中显示的查询。


0

更新最新的一个ID

 ALTER TABLE table_name AUTO_INCREMENT = 
 (SELECT (id+1) id FROM table_name order by id desc limit 1);


0

我用Google搜索并找到了这个问题,但是我真正要寻找的答案满足两个条件:

  1. 使用纯MySQL查询
  2. 将现有表的自动增量重置为max(id)+ 1

由于我在这里找不到我想要的东西,因此我将各种答案中的答案拼凑起来并在此处共享。

几件事要注意:

  1. 有问题的表是InnoDB
  2. 该表使用id类型int作为主键的字段
  3. 纯粹在MySQL中执行此操作的唯一方法是使用存储过程
  4. 我下面的图像使用SequelPro作为GUI。您应该能够根据首选的MySQL编辑器对其进行调整
  5. 我已经在MySQL 版本14.14 Distrib 5.5.61上针对debian-linux-gnu测试了这一点

步骤1:创建存储过程

创建一个这样的存储过程:

DELIMITER //
CREATE PROCEDURE reset_autoincrement(IN tablename varchar(200))
BEGIN

      SET @get_next_inc = CONCAT('SELECT @next_inc := max(id) + 1 FROM ',tablename,';');
      PREPARE stmt FROM @get_next_inc; 
      EXECUTE stmt; 
      SELECT @next_inc AS result;
      DEALLOCATE PREPARE stmt; 

      set @alter_statement = concat('ALTER TABLE ', tablename, ' AUTO_INCREMENT = ', @next_inc, ';');
      PREPARE stmt FROM @alter_statement;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;
END //
DELIMITER ;

然后运行它。

在运行之前,当您查看数据库中的“存储过程”时,它看起来像这样。

在此处输入图片说明

运行时,只需选择存储过程,然后按“运行选择”

在此处输入图片说明

注意:定界符部分至关重要。因此,如果您从该问题的顶部选择的答案中复制和粘贴,则由于这些原因它们往往不起作用。

运行后,我应该看到存储过程

在此处输入图片说明

如果需要更改存储过程,则需要删除存储过程,然后选择再次运行。

步骤2:调用存储过程

这次,您可以简单地使用普通的MySQL查询。

call reset_autoincrement('products');

最初来自我自己的SQL查询笔记,网址https://simkimsia.com/library/sql-queries/#mysql-reset-autoinc,适用于StackOverflow



-1

尝试运行此查询

 ALTER TABLE tablename AUTO_INCREMENT = value;

或尝试使用此查询重置自动增量

 ALTER TABLE `tablename` CHANGE `id` `id` INT(10) UNSIGNED NOT NULL;

并设置自动增量,然后运行此查询

  ALTER TABLE `tablename` CHANGE `id` `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT;

-2

我建议您转到查询浏览器并执行以下操作:

  1. 转到纲要,找到要更改的表。
  2. 右键单击并选择复制创建语句。
  3. 打开结果选项卡,然后将create语句粘贴到它们。
  4. 转到create语句的最后一行,并查找Auto_Increment = N(其中N是auto_increment字段的当前数字。)
  5. 将N替换为1。
  6. ctrl+enter

在表格中输入新行后,Auto_increment应该重置为1。

我不知道如果尝试在已存在auto_increment字段值的行中添加行,该怎么办。

希望有帮助!


-2

最好的方法是使用AI删除字段,然后使用AI重新添加字段,适用于所有表


1
根本不是最好的方法,删除列将丢失列数据
Disha Goyal
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.