我在编写查询或程序时遇到问题。我的要求是我想将表A及其子表B中的数据移动到具有相同结构的新父表(C)及其子表(D)。
表A中的主键列插入表B中的一列中以供参考。我的挑战是当我从父表A移动到新的父表C时,将生成新的主键。当我将数据从子表B移动到新的子表D时,我想将新生成的键插入表D中并使用相应的行。
它可能只是对某人的程序或查询。但我无法弄清楚。需要一些帮助!
答案 0 :(得分:0)
假设您有一张表A:
创建表a( id int(10)unsigned NOT NULL AUTO_INCREMENT, some_data varchar(100), PRIMARY KEY(id) )AUTO_INCREMENT = XXX;
表C:
创建表c( id int(10)unsigned NOT NULL AUTO_INCREMENT, some_data varchar(100), PRIMARY KEY(id) )AUTO_INCREMENT = YYY;
在表c上写下你的auto_increment值并从你的c.id中删除它:
ALTER TABLE c CHANGE id id int(10)unsigned NOT NULL;
创建一个临时表,例如。 tmp_copy_a_c具有相同的auto_increment vaule: CREATE TEMPORARY TABLE tmp_copy_a_c( id_c int(10)unsigned NOT NULL AUTO_INCREMENT, id_a int(10)unsigned NOT NULL, some_data varchar(100), PRIMARY KEY(id_c), INDEX(id_a) )AUTO_INCREMENT = YYY;
然后将所有数据从A复制到临时表:
INSERT INTO tmp_copy_a_c(id_a,some_data)SELECT id,some_data FROM WHERE“表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是另一个自动增量): INSERT INTO d(id_c,some_child_data) SELECT tmp.id_c,b.some_child_data FROM tmp_copy_a_c tmp 加入b ON tmp.id_a = b.id_a;
在表C上重新创建auto_increment,如下所示:
ALTER TABLE c CHANGE id id int(10)unsigned NOT NULL AUTO_INCREMENT;
注意:此解决方案假设在运行此脚本时,其他进程不会增加/更改表。