假设你有一张桌子 A:
创建表 a (
id int(10) 无符号 NOT NULL AUTO_INCREMENT,
some_data varchar(100),
主键(id)
) AUTO_INCREMENT=XXX;
还有表C:
创建表 c (
id int(10) 无符号 NOT NULL AUTO_INCREMENT,
some_data varchar(100),
主键(id)
) AUTO_INCREMENT=YYY;
将您的 auto_increment 值写入表 c 并将其从您的 c.id 中删除:
ALTER TABLE c CHANGE id id int(10) unsigned NOT NULL;
创建一个临时表,例如。 tmp_copy_a_c 具有相同的 auto_increment 值:
创建临时表 tmp_copy_a_c (
id_c int(10) 无符号 NOT NULL AUTO_INCREMENT,
id_a int(10) 无符号非空,
some_data varchar(100),
主键(id_c),
索引 (id_a)
) AUTO_INCREMENT=YYY;
然后将A中的所有数据复制到临时表中:
INSERT INTO tmp_copy_a_c(id_a, some_data) SELECT id, some_data FROM a WHERE "table a 上的一些条件";
从 tmp_copy_a_c 复制到表 c:
INSERT INTO c(id, some_data) SELECT id_c, some_data FROM tmp_copy_a_c;
将数据从表 B 复制到表 D(假设 id_d 是另一个自动增量):
插入 d(id_c, some_child_data)
选择 tmp.id_c,b.some_child_data
FROM tmp_copy_a_c tmp
加入乙
ON tmp.id_a = b.id_a;
像这样在表 C 上重新创建 auto_increment:
ALTER TABLE c CHANGE id id int(10) unsigned NOT NULL AUTO_INCREMENT;
注意:此解决方案假定表在运行此脚本时没有增长/被其他进程更改。