我正在尝试设置一个脚本来生成一组特定的测试数据到我的数据库中,在开始时我想清除相关的表而不删除约束(因为测试数据不适合我的数据库)重建约束)并重置每个表的AUTO_INCREMENT,因为如果我可以对许多ID进行硬编码,那么设置测试数据要简单得多。
例如,我有两个这样的语句(几乎每个表都有一对):
DELETE FROM AppointmentAttr
ALTER TABLE AppointmentAttr AUTO_INCREMENT = 1
当记录被删除时,自动增量值不会恢复为1,即使我找到的所有文档和SO答案都表明这应该有效。
如果我在MySQL Workbench中执行相同的语句,它也不会还原它。
这是在INNODB数据库上。
我错过了什么?
(注意:由于存在约束,我不能使用TRUNCATE。)
答案 0 :(得分:13)
MySQL不允许您减少AUTO_INCREMENT值,如下所示: http://dev.mysql.com/doc/refman/5.6/en/alter-table.html
您无法将计数器重置为小于或等于当前正在使用的值的值。对于InnoDB和MyISAM,如果该值小于或等于AUTO_INCREMENT列中当前的最大值,则该值将重置为当前最大AUTO_INCREMENT列值加1。
即使有你的约束,我也会尝试下列之一:
OP注意:这是我需要的(1)。
答案 1 :(得分:9)
从我所看到的关于alter table语句。
您可以使用ALTER TABLE语句重置自动增量值。用于重置自动增量值的ALTER TABLE语句的语法如下:
ALTER TABLE table_name AUTO_INCREMENT = value;
在ALTER TABLE子句之后指定表名,并在表达式AUTO_INCREMENT = value中指定要重置的值。
请注意,该值必须大于或等于自动增量列的当前最大值。
我怀疑你的问题出在哪里。所以基本上你剩下几个选项如下:
ALTER自动编号栏:我没试过,但理论上你可以将主键列从自动编号改为int,然后再将其设为自动编号。类似的东西:
ALTER TABLE tblName MODIFY COLUMN pkKeyColumn BIGINT NOT NULL;
ALTER TABLE tblName MODIFY COLUMN pkKeyColumn BIGINT AUTONUMBER NOT NULL;
希望这些有所帮助。
答案 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。
否则如果在整个循环中找不到,则插入默认值;
$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 :(得分:0)
在无问题的情况下,您可以
ALTER TABLE tbl AUTO_INCREMENT = 0;
将auto_increment值设置为当时允许的最低值。
答案 5 :(得分:0)
中的
ALTER TABLEtbl
DROP COLUMN id; ALTER TABLEtbl
ADDid
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;