MySQL中未重置自动增量

5n0oy7gb  于 2023-03-17  发布在  Mysql
关注(0)|答案(9)|浏览(147)

我尝试设置一个脚本来生成一组特定的测试数据到我的数据库中,在开始的时候,我想清除相关的表而不删除约束(因为测试数据不是重建约束的适当位置),并重置每个表的AUTO_INCREMENT,因为如果我可以硬编码许多ID,那么设置测试数据就会简单得多。
例如,我有两个这样的语句(几乎每个表都有一对):

DELETE FROM AppointmentAttr
ALTER TABLE AppointmentAttr AUTO_INCREMENT = 1

当记录被删除时,自动增量值不会恢复为1,尽管我能找到的所有文档和SO答案都表明这应该可以工作。
如果我在MySQL Workbench中执行相同的语句,它也不会恢复。
这是在INNODB数据库上。
我错过了什么?
(Note:由于存在约束,我无法使用TRUNCATE)。

yqkkidmi

yqkkidmi1#

MySQL不允许您减小AUTO_INCREMENT值,如下所示:http://dev.mysql.com/doc/refman/5.6/en/alter-table.html
不能将计数器重置为小于或等于当前正在使用的值。对于InnoDB和MyISAM,如果该值小于或等于AUTO_INCREMENT列中当前的最大值,则该值将重置为AUTO_INCREMENT列的当前最大值加1。
即使有您的限制,我也会尝试以下方法之一:
1.显式地插入测试数据的标识。MySQL不像其他一些数据库引擎,在这方面没有问题
1.如果约束不在标识列本身上,则删除并重新创建标识列(或只是将其从标识更改为标识)。
1.不要使用标识列,而使用另一种方法(如过程或外部代码)来控制标识。这实际上是最后的手段,我通常不推荐这样做...
OP注解:这就是我所需要的。

56lgkhnf

56lgkhnf2#

从我对alter table语句的了解来看。
可以使用ALTER TABLE语句重置自动增量值。用于重置自动增量值的ALTER TABLE语句的语法如下:

ALTER TABLE table_name AUTO_INCREMENT = value;

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

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

我怀疑这就是你的问题所在。所以基本上你只剩下以下几个选择:
1.截断表:根据我们的讨论这不是一个选项
1.删除并重新创建表:漫长而痛苦的经历

  1. ALTER自动编号列:我还没有尝试过这种方法,但是理论上你可以把主键列从auto number改为int,然后再把它变成auto number。
ALTER TABLE tblName MODIFY COLUMN pkKeyColumn  BIGINT NOT NULL;
ALTER TABLE tblName MODIFY COLUMN pkKeyColumn  BIGINT AUTONUMBER NOT NULL;

希望这些能帮上点忙。

1cosmwyk

1cosmwyk3#

您能否取消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,只是去了文档。如果你需要进一步的帮助,留下评论,我会尽我所能帮助。

yqlxgs2m

yqlxgs2m4#

我敢肯定,这已经回答了很长时间,但当我需要截断,我不能只是做一个set foreign_key_checks = 0,然后运行我的截断,然后set foreign_key_checks = 1

vngu2lb8

vngu2lb85#

我在删除表中间的行时遇到过这个问题。我的答案是INSERT NEW DATA TO NOT EXISTING ID。* 我希望我的答案仍然有用,即使它是PHP而不是MYSQL。*
1.首先获取您的数据。
1.如果发现不存在行,则插入值并退出;
1.否则,如果在整个循环中没有找到,则插入缺省值;

$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

我希望这会有所帮助。

mklgxw1f

mklgxw1f6#

在您的phpMyAdmin中添加

ALTER TABLE 

    tbl
DROP COLUMN id;
ALTER TABLE 

    tbl
ADD 

    id
INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (

    id
);
kh212irz

kh212irz7#

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

tzcvj98z

tzcvj98z8#

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

rqenqsqc

rqenqsqc9#

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

ALTER TABLE tbl AUTO_INCREMENT = 0;

这使得auto_increment值下降到此时允许的最低值。

相关问题