如何重置字段的AUTO_INCREMENT?

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


当前回答

您可以通过以下方式重置计数器:

ALTER TABLE tablename AUTO_INCREMENT = 1

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

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

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

其他回答

表格的自动递增计数器可以通过两种方式设置:

通过执行查询,就像其他人已经解释过的那样:ALTER TABLE<TABLE_name>AUTO_INCREMENT=<TABLE_id>;使用Workbench或其他可视化数据库设计工具。我将在Workbench中展示它是如何实现的,但在其他工具中也应该不会有太大不同。右键单击所需的表格,然后从上下文菜单中选择Alter table。在底部,您可以看到更改表格的所有可用选项。选择“选项”,您将获得此表单:

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

我搜索了一下,发现了这个问题,但我真正想要的答案满足两个标准:

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

由于我在这里找不到我想要的东西,我从各种答案中拼凑出了答案,并在这里分享。

需要注意的几点:

所讨论的表是InnoDB该表使用类型为int的字段id作为主键在MySQL中实现这一点的唯一方法是使用存储过程我下面的图片使用SequelPro作为GUI。您应该能够根据您首选的MySQL编辑器对其进行调整我已经在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 ;

然后运行它。

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

运行时,只需选择存储过程并按run Selection

注意:分隔符部分至关重要。因此,如果你复制并粘贴这个问题中最热门的答案,它们往往不会因为这个原因而起作用。

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

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

步骤2:调用存储过程

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

call reset_autoincrement('products');

最初来自我自己的SQL查询注释https://simkimsia.com/reset-mysql-autoincrement-to-max-id-plus-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;
ALTER TABLE tablename 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一起工作,我不需要知道当前的最大值!

这边自动递增计数器将复位,并将从存在的最大值自动启动。