如何在MySQL中重置AUTO_INCREMENT

How to reset AUTO_INCREMENT in MySQL

提问人:homerun 提问时间:1/19/2012 最后编辑:Peter Mortensenhomerun 更新时间:6/29/2023 访问量:1827983

问:

如何重置字段?AUTO_INCREMENT

我希望它再次开始计数。1

MySQL SQL 自增

评论

99赞 Konerak 1/19/2012
您可能还想清空表:TRUNCATE TABLE yourTableName;
1赞 Andy Lester 4/5/2019
我想建议,你的自动增量值是什么并不重要。你不应该依赖他们的价值观,也不应该对他们赋予任何意义。
0赞 The Impaler 12/9/2020
为什么?我看不到这个用例,除非你正在清理/截断整个表。
4赞 Naz 9/19/2013
如何重置MySQL自动增量列注释中给出了一些不错的选项,这些选项不适用于InnoDB ALTER TABLE tablename AUTO_INCREMENT = value;
0赞 TARKUS 2/15/2023
我不是专家,但我用来重置整个表,包括所有值。有时我想重置索引,但不想删除表内容。这个问题没有说,但我感觉到他们在问如何重置auto_increment,从 1 开始。TRUNCATE TABLE

答:

2564赞 Niels 1/19/2012 #1

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

ALTER TABLE tablename AUTO_INCREMENT = 1

InnoDB数据库

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

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

咏叹调

在具有 Aria 存储引擎的表中,auto_increment值可以设置为任何值,甚至低于当前最大值的值。但是,下一次插入使用下一个可用值 (max + 1),忽略设置值。如果设置为更高的值,它将继续使用并从该值开始递增。文档对此不是特别清楚,但在 Mariadb 10.11.3 中观察到了这一点

另请参阅

请参阅如何使用另一个表中的 MAX 值重置 MySQL AutoIncrement? 了解如何动态获取可接受的值。

评论

10赞 B T 8/4/2012
对于一张满员的桌子来说,这可能需要很长时间。请注意这一点:stackoverflow.com/questions/2681869/......
57赞 Besnik 2/21/2013
这是一个circular reference
98赞 Rostol 9/10/2013
请记住,MySql将创建一个具有相同结构和新auto_increment值的新表,并复制原始表中的所有记录,删除原始表并重命名新表。如果表很大,这可能会对生产环境的性能(和磁盘空间)产生相当大的影响。
8赞 workwise 9/18/2021
@Rostol 即使在今天(2021 年的 MySQL 8+),这个问题是否仍然存在?我看到,即使是大表,重置AUTO_INCREMENT也是瞬间的。我有点需要重置功能,因为我有 ON DUPLICATE KEY UPDATE 查询,每次运行时都会不必要地增加计数器。
77赞 fyr 1/19/2012 #2

简单来说,就像这样:

ALTER TABLE tablename AUTO_INCREMENT = value;

参考: 13.1.9 ALTER TABLE 语句

评论

7赞 Besnik 2/21/2013
reset表示将其设置为默认值...因此,您可以将“value”替换为 1
-6赞 jeson 7/5/2013 #3

我建议你去查询浏览器并执行以下操作:

  1. 转到架构并找到要更改的表。

  2. 单击鼠标右键,然后选择 copy create statement。

  3. 打开结果选项卡并粘贴 create 语句。

  4. 转到 create 语句的最后一行,查找 Auto_Increment=N, (其中 N 是auto_increment字段的当前数字。

  5. 将 N 替换为 1。

  6. Ctrl + Enter

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

我不知道如果您尝试添加已存在auto_increment字段值的行会发生什么。

38赞 lreeder 12/10/2013 #4

这个问题评分最高的答案都推荐“改变你的可AUTO_INCREMENT=值”。但是,仅当 in the alter 大于 autoincrement 列的当前最大值时,这才有效。根据 MySQL 8 文档value

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

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

14赞 3 revs, 2 users 71%Alin Razvan #5
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!!.

61赞 Miles M. 5/4/2014 #6

Enter image description here

在“操作”选项卡下,phpMyAdmin有一种非常简单的方法。在表格选项中,您可以将自动增量设置为所需的数字。

167赞 Nghiệp 5/5/2014 #7
SET  @num := 0;

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

ALTER TABLE your_table AUTO_INCREMENT =1;
45赞 salouri 9/17/2014 #8

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

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赞 reformed 7/22/2022
如果该列是另一个表的外键,则此操作不起作用。ID
27赞 Manohar Kumar 5/15/2015 #9

小心!删除 .TRUNCATE TABLE your_tableyour_table

您还可以像这样使用语法表:TRUNCATE

TRUNCATE TABLE table_name

评论

28赞 Zanshin13 8/5/2015
新程序员,请注意,这也将删除指定表中的所有行!TRUNCATE
1赞 M Amir Shahzad 10/6/2021
为什么要全部删除?
1赞 Robert Fornesdale 11/20/2022
默认情况下,当您使用外键约束时,这不起作用。最好一步一步来,知道你刚刚在做什么。从表中删除 *;更改表 auto_increment = 1;...避免意外的更好方法!
0赞 Michael Currie 1/21/2023
根据 mysql 文档,这也将根据需要重置。dev.mysql.com/doc/refman/8.0/en/truncate-table.htmlAUTO_INCREMENT
1赞 Cepheus 7/6/2015 #10

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

28赞 SeanN 9/26/2015 #11

从 MySQL 5.6 开始,您可以将简单的 ALTER TABLE 与 InnoDB 一起使用:

ALTER TABLE tablename AUTO_INCREMENT = 1;

文档已更新以反映以下内容:

13.1.7 ALTER TABLE语句

我的测试还表明该表被复制。该值只是更改。

0赞 BARIS KURT 1/7/2017 #12
ALTER TABLE `table_name`   DROP `id`;

ALTER TABLE `table_name` ADD `id` INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (`id`) ;

很快,首先我们删除了id列,然后再次添加了主键id...

评论

1赞 RBT 1/7/2017
请允许我请求您围绕您的回答添加更多背景信息。只有代码的答案很难理解。如果您可以在帖子中添加更多信息,这将对提问者和未来的读者有所帮助。
0赞 BARIS KURT 2/27/2017
很快,首先我们删除了id列,然后再次添加了主键id...
14赞 Abdul Aziz Al Basyir 4/5/2017 #13

它适用于一个空表:

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`);
-3赞 Grumpy 6/3/2017 #14

最好的方法是使用 AI 删除字段,然后使用 AI 再次添加。它适用于所有表。

评论

2赞 Peter Mortensen 8/6/2021
什么是“AI”?人工智能?还是别的什么?
10赞 narasimharaosp 8/11/2017 #15

要更新到最新的加一个 ID,请执行以下操作:

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

编辑:

SET @latestId = SELECT MAX(id) FROM table_name;
SET @nextId = @latestId + 1;
ALTER TABLE table_name AUTO_INCREMENT = @nextId;

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

评论

0赞 Peter Mortensen 8/6/2021
这有点令人困惑。你能改写一下吗?
3赞 Kristijan Iliev 10/11/2017 #16

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

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

    ALTER TABLE <table_name> AUTO_INCREMENT=<table_id>;

  2. 使用 Workbench 或其他可视化数据库设计工具。我将在 Workbench 中展示它是如何完成的 - 但在其他工具中也应该没有太大区别。通过右键单击所需的表并从上下文菜单中进行选择。在底部,您可以看到用于更改表格的所有可用选项。选择,您将获得此表格:Alter tableOptions

    Enter image description here

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

评论

0赞 Steve Stilson 7/8/2023
我正在使用 MySQL Workbench。在我做彼得·莫滕森的答案之前,没有一个答案对我有用。谢谢。这奏效了!
8赞 santosh mahule 5/21/2018 #17
ALTER TABLE tablename AUTO_INCREMENT = 1

评论

0赞 Peter Mortensen 8/6/2021
解释是有序的。
0赞 Manngo 11/15/2023
...这是公认的答案的替代方案,因为......?
9赞 bdalina 6/26/2018 #18

警告:如果您的列有约束或作为外键连接到其他表,这将产生不良影响。

首先,删除列:

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
1赞 Kim Stacks 9/13/2018 #19

我用谷歌搜索并找到了这个问题,但我真正在寻找的答案满足两个标准:

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

由于我无法在这里找到我想要的确切内容,因此我从各种答案中拼凑出答案并在这里分享。

需要注意的几点:

  1. 有问题的表是 InnoDB
  2. 该表使用类型为 AS 的字段作为主键idint
  3. 纯粹在MySQL中执行此操作的唯一方法是使用存储过程
  4. 我下面的图像使用 SequelPro 作为 GUI。您应该能够根据您喜欢的MySQL编辑器进行调整
  5. 我已经在 MySQL Ver 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 ;

然后运行它。

在运行之前,当您在数据库中的“存储过程”下查看时,它如下所示。

enter image description here

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

enter image description here

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

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

enter image description here

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

步骤 2:调用存储过程

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

call reset_autoincrement('products');

最初来自我自己的 SQL 查询笔记,https://simkimsia.com/reset-mysql-autoincrement-to-max-id-plus-1/ 并适用于 Stack Overflow。

8赞 artsafin 11/14/2018 #20

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

alter table tablename auto_increment=1, algorithm=inplace;

评论

0赞 Peter Mortensen 8/6/2021
DDL = 数据定义语言
4赞 Shabeer K 6/23/2019 #21

尝试运行此查询:

 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;
8赞 Mihai Galan 8/2/2019 #22
SET @num := 0;
UPDATE your_table SET id = @num := (@num+1);
ALTER TABLE your_table AUTO_INCREMENT =1;

评论

0赞 Peter Mortensen 8/6/2021
解释是有序的。例如,想法/要点是什么?它与其他答案有何不同?请通过编辑(更改)您的答案来回复,而不是在评论中(没有“编辑:”,“更新:”或类似内容 - 答案应该看起来像今天写的一样)。
0赞 Nandostyle 8/29/2021
@num应该是表上的最后一个 ID 号。它将在此基础上加 1,并将插入时的下一个 Id 数字设置为此 @Num+1。然后,auto_increment将设置为在每次插入时将 1 添加到下一个 ID。请注意,t:= 和 = 执行相同的操作。
-5赞 Peter Gruppelaar 10/3/2020 #23

您需要遵循 Miles M 评论中的建议,这里有一些 PHP 代码可以修复 MySQL 中的范围。此外,您还需要打开 my.ini 文件 (MySQL) 并将 max_execution_time=60 更改为 max_execution_time=6000;适用于大型数据库。

不要使用“ALTER TABLE tablename AUTO_INCREMENT = 1”。它将删除数据库中的所有内容。

$con = mysqli_connect($dbhost, $dbuser, $dbpass, $database);
$res = mysqli_query($con, "select * FROM data WHERE id LIKE id ORDER BY id ASC");

$count = 0;
while ($row = mysqli_fetch_array($res)){
    $count++;

    mysqli_query($con, "UPDATE data SET id='".$count."' WHERE id='".$row['id']."'");
}
echo 'Done reseting id';
mysqli_close($con);

评论

0赞 Peter Mortensen 8/6/2021
回复“迈尔斯 M 的评论”:你是说迈尔斯 M 的答案吗?
2赞 Artur Müller Romanov 5/20/2022 #24

如果您正在使用,则必须在以下位置输入此内容:PHPStorm's database tooldatabase console

ALTER TABLE <table_name> AUTO_INCREMENT = 0;

评论

0赞 easleyfixed 7/21/2022
请注意 - 它不一定是 PHPStorm 的数据库工具。如果您有幸将数据库托管在运行 Microsoft 服务器操作系统的服务器上,您可以下载 MS Workbench 并执行此操作。
1赞 AbdulBasit 2/12/2023 #25
delete from url_rewrite where 1=1;
ALTER TABLE url_rewrite AUTO_INCREMENT = 1;

然后重新索引