MySQL中没有重置自动增量

时间:2013-07-17 01:41:25

标签: mysql

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

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

DELETE FROM AppointmentAttr
ALTER TABLE AppointmentAttr AUTO_INCREMENT = 1

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

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

这是在INNODB数据库上。

我错过了什么?

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

9 个答案:

答案 0 :(得分:13)

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。这真的是最后的手段,我一般不会推荐它......
  4. OP注意:这是我需要的(1)。

答案 1 :(得分:9)

从我所看到的关于alter table语句。

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

ALTER TABLE table_name AUTO_INCREMENT = value;

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

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

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

  1. TRUNCATE TABLE:根据我们的讨论不是一个选项
  2. DROP AND RECREATE the table:漫长而痛苦的经历
  3. ALTER自动编号栏:我没试过,但理论上你可以将主键列从自动编号改为int,然后再将其设为自动编号。类似的东西:

    ALTER TABLE tblName MODIFY COLUMN pkKeyColumn  BIGINT NOT NULL;
    ALTER TABLE tblName MODIFY COLUMN pkKeyColumn  BIGINT AUTONUMBER NOT NULL;
    
  4. 希望这些有所帮助。

答案 2 :(得分:4)

你能不能drop the relevant, auto increment column重新创建吗?示例如下:

;;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,只是关闭文档。如果您需要进一步的帮助,请发表评论,我会尽力帮助您。

答案 3 :(得分:1)

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

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

    $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
    
  4. 我希望它会以某种方式提供帮助。

答案 4 :(得分:0)

在无问题的情况下,您可以

ALTER TABLE tbl AUTO_INCREMENT = 0;

将auto_increment值设置为当时允许的最低值。

答案 5 :(得分:0)

您的phpMyAdmin

中的

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

答案 6 :(得分:0)

ALTER TABLE table_name AUTO_INCREMENT = value;
这对我有用,我必须将它设置为我的数据库中的最后一条记录,而通过操作面板从未为我工作过。

答案 7 :(得分:0)

我确定这已经得到了很长时间的回答,但是当我需要截断时,我只能执行set foreign_key_checks = 0然后运行我的截断,然后set foreign_key_checks = 1

答案 8 :(得分:0)

这对我有用,希望它有所帮助。 SET @autoid = 0; UPDATE users set id = @autoid := (@autoid+1); ALTER TABLE users AUTO_INCREMENT = 1;