关于sql:如何重置MySQL中的AUTO_INCREMENT?

How to reset AUTO_INCREMENT in MySQL?

如何重置字段的AUTO_INCREMENT?我想让它再次从江户记下。


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

1
ALTER TABLE tablename AUTO_INCREMENT = 1

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

Note that you cannot reset the counter to a value less than or equal
to any that have already been used. For MyISAM, if the value is less
than or equal to the maximum value currently in the AUTO_INCREMENT
column, the value is reset to the current maximum plus one. For
InnoDB, if the value is less than the current maximum value in the
column, no error occurs and the current sequence value is not changed.

看看如何使用另一个表中的max值重置MySQL自动增量?关于如何动态获取可接受的值。


1
ALTER TABLE tablename AUTO_INCREMENT = 1


1
2
3
4
5
SET  @num := 0;

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

ALTER TABLE your_table AUTO_INCREMENT =1;

我想这就行了


就像这样:

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


enter image description here在"操作"选项卡下使用phpmyadmin有一种非常简单的方法,您可以在表选项中设置自动递增到所需的数字。


最适合我的解决方案是:

它很快,与InnoDB一起工作,我不需要知道当前的最大值!这样,自动递增计数器将重置,并从存在的最大值自动启动。


在如何重置mysql autoincrement列中提供了很好的选项

注意,ALTER TABLE tablename AUTO_INCREMENT = value;不适用于innodb


对这个问题的最高评价的答案都建议"改变你的可移动的自动增量=值"。但是,只有当alter中的value大于autoincrement列的当前最大值时,这才有效。根据MySQL8文档:

You cannot reset the counter to a value less than or equal to the value that is currently in use. For both InnoDB and MyISAM, if the value is less than or equal to the maximum value currently in the AUTO_INCREMENT column, the value is reset to the current maximum AUTO_INCREMENT column value plus one.

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


因为MySQL5.6中的功能发生了变化,所以添加了一个更新。从MySQL5.6开始,您可以在InnoDB中使用简单的alter表:

1
ALTER TABLE tablename AUTO_INCREMENT = 1;

更新文档以反映这一点:

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

我的测试还显示表没有被复制,值只是被简单地更改了。


1
2
3
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!!!!.


您也可以这样使用语法TRUNCATE表:TRUNCATE TABLE table_name

当心!!TRUNCATE TABLE your_table将删除你的your_table中的所有内容!!


用于空表:

1
ALTER TABLE `table_name` AUTO_INCREMENT = 1;

如果您有数据,但希望整理,我建议使用:

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


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

>第一:删除列

1
ALTER TABLE tbl_name DROP COLUMN column_id

>第二:重新创建列并将其设置为第一列,如果您希望它是我假定的第一列。

这很管用!


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

alter table tablename auto_increment=1, algorithm=inplace;


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

1
TRUNCATE TABLE TABLE_NAME


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

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

    ALTER TABLE AUTO_INCREMENT=;

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

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


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


    更新最新的一个ID

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

    更改表tablename auto_increment=1


    我在谷歌上搜索并找到了这个问题,但我真正想要的答案符合两个标准:

  • 使用纯mysql查询
  • 将现有表自动增量重置为max(id)+1
  • 因为我在这里找不到我想要的确切答案,所以我从各种答案中拼凑出答案,并在这里分享。

    需要注意的几点:

  • 有问题的表是innodb
  • 该表使用字段id,类型为int作为主键。
  • 在MySQL中实现这一点的唯一方法是使用存储过程
  • 我下面的图片使用Sequelpro作为图形用户界面。你应该能够根据你喜欢的mysql编辑器来调整它。
  • 我在mysql ver 14.14 distrib 5.5.61上测试过这个版本,用于DebianLinuxGNU
  • 步骤1:创建存储过程

    创建这样的存储过程:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    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查询。

    1
    call reset_autoincrement('products');

    最初摘自https://simkimsia.com/library/sql queries/my sql reset autoinc中我自己的SQL查询注释,适用于stackoverflow


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


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

  • 转到Schemata并找到要更改的表。
  • 右键单击并选择"复制创建语句"。
  • 打开一个结果选项卡并将创建语句粘贴到它们的。
  • 转到create语句的最后一行,查找auto_increment=n,(其中n是自动增量字段的当前数字。)
  • 将n替换为1。
  • ctrl+enter
  • 在表中输入新行后,自动增量应重置为1。

    我不知道如果您试图添加一个已经存在自动递增字段值的行会发生什么。

    希望这有帮助!