如何在MySQL中重置AUTO_INCREMENT

我怎么能重置AUTO_INCREMENT字段?

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

1675766 次浏览

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

ALTER TABLE tablename AUTO_INCREMENT = 1

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

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

关于如何动态获取可接受的值,请参阅如何使用另一个表中的MAX值重置MySQL自动增量?

就像这样:

ALTER TABLE tablename AUTO_INCREMENT = value;

参考:13.1.9 ALTER TABLE语句

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

  1. 转到模式并找到要更改的表。

  2. 右键单击并选择复制创建语句。

  3. 打开一个结果选项卡并粘贴创建语句。

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

  5. 将N替换为1。

  6. Ctrl+输入

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

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

这个问题的最高评分答案都推荐“ALTER your tableAUTO_INCREMENT=value”。但是,这仅在更改中的value大于自动增量列的当前最大值时有效。根据MySQL 8留档

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

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

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!!!。

在此输入图片描述

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

SET  @num := 0;
UPDATE your_table SET id = @num := (@num+1);
ALTER TABLE your_table AUTO_INCREMENT =1;

对我来说最好的解决方案:

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,我不需要知道当前的最大值!

这样。自动增量计数器将重置,它将从存在的最大值自动启动。

当心!TRUNCATE TABLE your_table删除所有内容放在你的your_table中。

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

TRUNCATE TABLE table_name

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

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

ALTER TABLE tablename AUTO_INCREMENT = 1;

留档已更新以反映这一点:

13.1.7 ALTER TABLE语句

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

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

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

这是一个空表:

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

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

要更新到最新的加一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;

未测试请在运行前测试*

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

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

    ALTER TABLE <table_name> AUTO_INCREMENT=<table_id>;

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

    在此输入图片描述

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

ALTER TABLE tablename AUTO_INCREMENT = 1

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

首先,删除列:

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. 使用纯MySQL查询
  2. 将现有表的自动增量重置为max(id)+1

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

需要注意的几件事:

  1. 问题表是InnoDB
  2. 该表使用字段id,类型为int作为主键
  3. 在MySQL中做到这一点的唯一方法是使用存储过程
  4. 我下面的图片使用SequelPro作为GUI。您应该能够根据您喜欢的MySQL编辑器对其进行调整
  5. 我已经在MySQLVer 14.14版本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');

最初来自我自己的SQLhttps://simkimsia.com/reset-mysql-autoincrement-to-max-id-plus-1/中的查询注释,并适用于Stack Overflow。

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

修改表表名auto_increment=1,算法=inplace;

尝试运行此查询:

 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;
SET @num := 0;UPDATE your_table SET id = @num := (@num+1);ALTER TABLE your_table AUTO_INCREMENT =1;

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

不要使用“ALTER TABLE tablenameAUTO_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);

如果您使用的是PHPStorm's database tool,则必须在database console中输入:

ALTER TABLE <table_name> AUTO_INCREMENT = 0;