MySQL中未重置自动增量

MySQL中未重置自动增量,mysql,Mysql,我试图设置一个脚本,在数据库中生成一组特定的测试数据,开始时我希望清除相关的表,而不删除约束(因为测试数据不是重建约束的合适位置)并重置每个表的自动增量,因为如果我可以硬编码许多ID,那么设置测试数据会非常简单 例如,我有两个这样的语句(几乎每个表都有一对): 当记录被删除时,自动增量值不会恢复为1,即使我能找到的所有文档和答案都表明这应该有效 如果我在MySQL Workbench中执行相同的语句,它也不会还原它 这在INNODB数据库上 我错过了什么 (注意:由于存在约束,我无法使用TRUN

我试图设置一个脚本,在数据库中生成一组特定的测试数据,开始时我希望清除相关的表,而不删除约束(因为测试数据不是重建约束的合适位置)并重置每个表的自动增量,因为如果我可以硬编码许多ID,那么设置测试数据会非常简单

例如,我有两个这样的语句(几乎每个表都有一对):

当记录被删除时,自动增量值不会恢复为1,即使我能找到的所有文档和答案都表明这应该有效

如果我在MySQL Workbench中执行相同的语句,它也不会还原它

这在INNODB数据库上

我错过了什么


(注意:由于存在约束,我无法使用TRUNCATE)。

从alter table语句中可以看到

您可以使用ALTERTABLE语句重置自动增量值。用于重置自动增量值的ALTER TABLE语句的语法如下所示:

ALTER TABLE table_name AUTO_INCREMENT = value;
在ALTER table子句之后指定表名,并在表达式AUTO_INCREMENT=value中指定要重置的值

请注意,该值必须大于或等于自动递增列的当前最大值。

我怀疑这就是你的问题所在。因此,基本上您只剩下以下几个选项:

ALTER TABLE table_name AUTO_INCREMENT = value;
  • 截断表:根据我们的讨论,这不是一个选项
  • 放下并重新创建桌子:一段漫长而痛苦的经历
  • ALTER auto number column:我没有尝试过这个方法,但理论上可以将主键列从auto number更改为int,然后再次将其设置为auto number。比如:

    ALTER TABLE tblName MODIFY COLUMN pkKeyColumn  BIGINT NOT NULL;
    ALTER TABLE tblName MODIFY COLUMN pkKeyColumn  BIGINT AUTONUMBER NOT NULL;
    

  • 希望这些对我有所帮助。

    从ALTERTABLE语句中我可以看到

    您可以使用ALTERTABLE语句重置自动增量值。用于重置自动增量值的ALTER TABLE语句的语法如下所示:

    ALTER TABLE table_name AUTO_INCREMENT = value;
    
    在ALTER table子句之后指定表名,并在表达式AUTO_INCREMENT=value中指定要重置的值

    请注意,该值必须大于或等于自动递增列的当前最大值。

    我怀疑这就是你的问题所在。因此,基本上您只剩下以下几个选项:

    ALTER TABLE table_name AUTO_INCREMENT = value;
    
  • 截断表:根据我们的讨论,这不是一个选项
  • 放下并重新创建桌子:一段漫长而痛苦的经历
  • ALTER auto number column:我没有尝试过这个方法,但理论上可以将主键列从auto number更改为int,然后再次将其设置为auto number。比如:

    ALTER TABLE tblName MODIFY COLUMN pkKeyColumn  BIGINT NOT NULL;
    ALTER TABLE tblName MODIFY COLUMN pkKeyColumn  BIGINT AUTONUMBER NOT NULL;
    

  • 希望这些有点帮助。

    MySQL不允许您减少自动增量值,如下所述:

    不能将计数器重置为小于或等于当前使用的值。对于InnoDB和MyISAM,如果该值小于或等于当前“自动增量”列中的最大值,则该值将重置为当前“自动增量”列中的最大值加上一

    即使有您的限制,我也会尝试以下方法之一:

  • 显式插入测试数据的标识。与其他一些数据库引擎不同,MySQL在这方面没有问题
  • 删除并重新创建您的标识列(或者只是将其从标识更改为标识),前提是该列本身不受约束
  • 不要使用标识列并使用其他方法(如过程或外部代码)来控制您的标识。这真的是万不得已的办法,我一般不推荐

  • OP中的注释:我需要的是(1)。

    MySQL不允许您减少自动增量值,如下所述:

    不能将计数器重置为小于或等于当前使用的值。对于InnoDB和MyISAM,如果该值小于或等于当前“自动增量”列中的最大值,则该值将重置为当前“自动增量”列中的最大值加上一

    即使有您的限制,我也会尝试以下方法之一:

  • 显式插入测试数据的标识。与其他一些数据库引擎不同,MySQL在这方面没有问题
  • 删除并重新创建您的标识列(或者只是将其从标识更改为标识),前提是该列本身不受约束
  • 不要使用标识列并使用其他方法(如过程或外部代码)来控制您的标识。这真的是万不得已的办法,我一般不推荐
  • OP中的注释:这是(1)我需要的。

    你不能重新创建它吗?示例如下:

    ;;assuming your column is called id and your table is tbl
    ALTER TABLE tbl DROP COLUMN id;
    ALTER TABLE tbl ADD COLUMN id BIGINT UNSIGNED DEFAULT 1 PRIMARY KEY FIRST;
    
    这个应该可以运行,但我不使用MySQL,只是不使用文档。如果您需要进一步的帮助,请留下评论,我会尽全力帮助您。

    您能不能重新创建它?示例如下:

    ;;assuming your column is called id and your table is tbl
    ALTER TABLE tbl DROP COLUMN id;
    ALTER TABLE tbl ADD COLUMN id BIGINT UNSIGNED DEFAULT 1 PRIMARY KEY FIRST;
    

    这个应该可以运行,但我不使用MySQL,只是不使用文档。如果您需要进一步的帮助,请留下评论,我会尽力提供帮助。

    当我从表中删除中间行时,遇到了这个问题。 我的答案是在不存在的ID中插入新数据。 我希望我的答案仍然有用,即使它是PHP而不是MYSQL

  • 首先获取您的数据
  • 如果发现不存在行,则插入值并退出
  • 否则,若在整个循环中找不到,则插入默认值

    $rez = mysql_query("SELECT * FROM users");
    $exists = 1;
    while($row = mysql_fetch_array($rez)){
            if ( $exists != $row{'id'} ){
                   echo "found not existing id: ".$exists;
                   INSERT INTO users VALUES($exists,.. ,..); 
                   exit;
             } $exists += 1;
     }
     INSERT INTO users VALUES(NULL,.. ,..);  ##auto_inc column converts NULL to latest
    

  • 我希望它能有所帮助。

    我从表中删除中间行时遇到了这个问题。 我的答案是在不存在的ID中插入新数据。 我希望我的答案仍然有用,即使它是PHP而不是MYSQL

  • 先取