基本概念是复制table1中的行,其中id介于100..10000之间, 修改一些列数据,然后插入一个新的id:
表2引用table1.id与外键,table3引用table2.id与外键 ....和tableX使用外键引用tableX-1.id。 我还有一些table2..tableX数据的修改。
我开始考虑编写嵌套循环;对于前3个表,它看起来像这样(在plsql中),也许它应该可以工作:
declare
table1_row table1%rowtype;
table2_row table2%rowtype;
table3_row table3%rowtype;
begin
for t1 in(select * from table1
where id between 100 and 10000)
loop
table1_row:=t1;
table1_row.id:=tableseq.nextval;
table1_row.col1:='asdf';
table1_row.col4:='xxx';
insert into table1 values table1_row;
for t2 in(select * from table2
where foreign_key_id =t1.id)
loop
table2_row:=t2;
table2_row.id:=tableseq.nextval;
table2_row.foreign_key_id:=table1_row.id;
table2_row.col3:='gfdgf';
insert into table2 values table2_row;
for t3 in(select * from table3
where foreign_key_id =t2.id)
loop
table3_row:=t3;
table3_row.id:=tableseq.nextval;
table3_row.foreign_key_id:=table2_row.id;
table3_row.col1:='gdfgdg';
insert into table3 values table3_row;
end loop;
end loop;
end loop;
end;
有更好的解决方案吗?大约有10-20个环,它看起来很糟糕:( 提前谢谢。
答案 0 :(得分:0)
我相信你可以使用带有几个子查询的insert语句来清理它。这是一个更简单的例子,但我相信你可以根据具体情况进行推断:
insert into table1
(col1, col2, col3, col4, col5)
values
select 'asdf',
(select table2_data --whatever data from this table you want
from table2
where foreign_key_id =table1.id),
(select table3_data --whatever data from this table you want
from table3
where foreign_key_id =table1.id),
'xxx',
table1.col5
from table1
where table1.id between 100 and 10000
请注意,您的id列应设置为Auto_increment主键,因此您不需要将其作为insert语句的一部分。另外,我添加了“table1.col5”作为如何使用重复行中现有行的相同数据的示例(因为我假设您要复制一些数据)。