我尝试设置一个脚本来生成一组特定的测试数据到我的数据库中,在开始的时候,我想清除相关的表而不删除约束(因为测试数据不是重建约束的适当位置),并重置每个表的AUTO_INCREMENT,因为如果我可以硬编码许多ID,那么设置测试数据就会简单得多。
例如,我有两个这样的语句(几乎每个表都有一对):
DELETE FROM AppointmentAttr
ALTER TABLE AppointmentAttr AUTO_INCREMENT = 1
当记录被删除时,自动增量值不会恢复为1,尽管我能找到的所有文档和SO答案都表明这应该可以工作。
如果我在MySQL Workbench中执行相同的语句,它也不会恢复。
这是在INNODB数据库上。
我错过了什么?
(Note:由于存在约束,我无法使用TRUNCATE)。
9条答案
按热度按时间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注解:这就是我所需要的。
56lgkhnf2#
从我对alter table语句的了解来看。
可以使用ALTER TABLE语句重置自动增量值。用于重置自动增量值的ALTER TABLE语句的语法如下:
在ALTER TABLE子句之后指定表名,并在表达式AUTO_INCREMENT = value中指定要重置为的值。
请注意,该值必须大于或等于自动增量列的当前最大值。
我怀疑这就是你的问题所在。所以基本上你只剩下以下几个选择:
1.截断表:根据我们的讨论这不是一个选项
1.删除并重新创建表:漫长而痛苦的经历
希望这些能帮上点忙。
1cosmwyk3#
您能否取消drop the relevant, auto increment column并重新创建它?示例如下:
这个应该工作,但我不使用MySQL,只是去了文档。如果你需要进一步的帮助,留下评论,我会尽我所能帮助。
yqlxgs2m4#
我敢肯定,这已经回答了很长时间,但当我需要截断,我不能只是做一个
set foreign_key_checks = 0
,然后运行我的截断,然后set foreign_key_checks = 1
。vngu2lb85#
我在删除表中间的行时遇到过这个问题。我的答案是INSERT NEW DATA TO NOT EXISTING ID。* 我希望我的答案仍然有用,即使它是PHP而不是MYSQL。*
1.首先获取您的数据。
1.如果发现不存在行,则插入值并退出;
1.否则,如果在整个循环中没有找到,则插入缺省值;
我希望这会有所帮助。
mklgxw1f6#
在您的phpMyAdmin中添加
kh212irz7#
ALTER TABLE table_name AUTO_INCREMENT = value;
这对我很有效,我必须将其设置为数据库中的最后一条记录,而通过操作面板从来没有对我起过作用。
tzcvj98z8#
这对我很有效,希望能有所帮助。
SET @autoid = 0; UPDATE users set id = @autoid := (@autoid+1); ALTER TABLE users AUTO_INCREMENT = 1;
rqenqsqc9#
在没有问题的情况下,您可以
这使得auto_increment值下降到此时允许的最低值。