MySQL中没有重置自动增量

Law*_*Dol 12 mysql

我正在尝试设置一个脚本来生成一组特定的测试数据到我的数据库中,在开始时我想清除相关的表而不删除约束(因为测试数据不是重建约束的适当位置)并重置每个表的AUTO_INCREMENT,因为如果我可以对许多ID进行硬编码,那么设置测试数据要简单得多.

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

DELETE FROM AppointmentAttr
ALTER TABLE AppointmentAttr AUTO_INCREMENT = 1
Run Code Online (Sandbox Code Playgroud)

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

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

这是在INNODB数据库上.

我错过了什么?

(注意:由于存在约束,我不能使用TRUNCATE).

Mar*_*ton 14

MySQL不允许您减少AUTO_INCREMENT值,如下所示:http: //dev.mysql.com/doc/refman/5.6/en/alter-table.html

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

即使有你的约束,我也会尝试下列之一:

  1. 明确插入您的测试数据的身份.与其他一些数据库引擎不同,MySQL没有这方面的问题
  2. 如果约束不在其上,则删除并重新创建您的标识列(或者只是将其更改为标识).
  3. 不使用Identity列并使用其他方法(例如过程或外部代码)来控制您的Identity.这真的是最后的手段,我一般不会推荐它......

OP的注释:这是(1)这就是我需要的.

  • 好的答案我没有考虑过显式插入身份。不是您通常会做的事。 (2认同)

Nam*_*ian 9

从我所看到的alter table语句.

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

ALTER TABLE table_name AUTO_INCREMENT = value;
Run Code Online (Sandbox Code Playgroud)

您可以在ALTER TABLE子句之后指定表名,并在表达式AUTO_INCREMENT = value中指定要重置的值.

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

我怀疑你的问题在哪里.所以基本上你剩下几个选项如下:

  1. TRUNCATE TABLE:根据我们的讨论,它不是一个选项
  2. DROP和RECREATE桌子:一个漫长而痛苦的经历
  3. ALTER自动编号栏:我没有试过这个,但理论上你可以将主键列从自动编号改为int,然后再将其设为自动编号.就像是:

    ALTER TABLE tblName MODIFY COLUMN pkKeyColumn  BIGINT NOT NULL;
    ALTER TABLE tblName MODIFY COLUMN pkKeyColumn  BIGINT AUTONUMBER NOT NULL;
    
    Run Code Online (Sandbox Code Playgroud)

希望这些有点帮助.

  • 如果只是删除`AUTONUMBER'然后像Namph那样重新开启它就可以解决这个问题,我会说这是问题的最佳答案 (2认同)