通过多个表(新id /外键)复制行,并进行一些列修改

时间:2015-10-11 18:17:41

标签: sql database tsql plsql

基本概念是复制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个环,它看起来很糟糕:( 提前谢谢。

1 个答案:

答案 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”作为如何使用重复行中现有行的相同数据的示例(因为我假设您要复制一些数据)。