15

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

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

DELETE FROM AppointmentAttr
ALTER TABLE AppointmentAttr AUTO_INCREMENT = 1

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

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

这是在一个 INNODB 数据库上。

我错过了什么?

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

4

9 回答 9

17

MySQL 不允许您减少 AUTO_INCREMENT 值,如此处指定:http: //dev.mysql.com/doc/refman/5.6/en/alter-table.html

您不能将计数器重置为小于或等于当前使用的值。对于 InnoDB 和 MyISAM,如果该值小于或等于 AUTO_INCREMENT 列中当前的最大值,则将该值重置为当前最大 AUTO_INCREMENT 列值加一。

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

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

来自 OP 的注释:我需要的是 (1)。

于 2013-07-17T01:58:27.400 回答
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 table:漫长而痛苦的经历
  3. 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;
    

希望这些有所帮助。

于 2013-07-17T01:57:33.033 回答
4

您不能删除相关的自动增量列并重新创建它吗?示例如下:

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

于 2013-07-17T02:02:53.383 回答
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
    

我希望它会有所帮助。

于 2015-05-19T16:47:04.713 回答
1

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

于 2017-08-01T17:29:37.887 回答
0

ALTER TABLE tblDROP COLUMN id;
ALTER TABLE tblADD idINT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY ( id);
在你的 phpMyAdmin

于 2016-07-27T07:09:24.653 回答
0

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

于 2017-07-21T09:58:20.417 回答
0

在没有问题的情况下,你可以做

ALTER TABLE tbl AUTO_INCREMENT = 0;

这使 auto_increment 值达到当时允许的最低值。

于 2016-02-13T22:43:20.470 回答
0

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

于 2021-07-02T15:14:45.737 回答