代码之家  ›  专栏  ›  技术社区  ›  Robin Sun

如何批量插入到两个表中,一个表的ID是另一个表的外键?

  •  3
  • Robin Sun  · 技术社区  · 7 年前

    有两张桌子。表用户的列如下

    ID,NAME,AGE
    

    表资产的列如下

    ID,ID_USER,PRICE
    

    asset的id_user是用户的id。

    表用户ID使用Sequence Seq_t_用户。 表asset的id使用sequence seq_t_asset。

    现在有1000000个用户等待插入。我们可以使用for循环单独处理每个记录。

    v_id_user = seq_t_user.nextval(); insert into User values(v_id_user, 'Lilie', 20); insert into Asset values(seq_t_asset.nextval(), v_id_user, 1000);

    但这是非常耗时的。是否可以同时将插入批处理到两个表中?

    2 回复  |  直到 7 年前
        1
  •  2
  •   deniz    7 年前

    看起来“无条件多任务插入”是您需要的。

    我假设您从我的表中获得所有值,但您可以根据需要进行修改;

    INSERT /*+ APPEND */ ALL
    INTO USER (ID,NAME,AGE) 
        values (seq_t_user.nextval(), name, age)
    INTO ASSET (ID,ID_USER,PRICE) 
        values (seq_t_asset.nextval(), seq_t_user.nextval(), price)
    with MY_VALUES as
        (select /*+ parallel */ 
             name,
             age,
             price
         from my_table)
    select /*+ parallel */ * from MY_VALUES
    

    编辑:我们了解到不能在select语句的多表插入中使用sequence。所以我们把序列移动到插入部分。

        2
  •  2
  •   APC    7 年前

    诀窍是使用全部插入。这允许我们从一个选择源填充多个表。我的例子使用 dual 所以你需要改变它来满足你的目的:

    insert all
    into t_user (id, name, age) 
        values (seq_t_user.nextval, name, age)
    into t_asset (id, id_user, price) 
        values (seq_t_asset.nextval, seq_t_user.nextval, price)
    select 'ROBIN' as name
            , 23 as age
            , 1200 as price
    from dual
    union all
    select  'APC' as name
             , 42 as age
             , 1100 as price
    from dual
    ;
    

    这里是 a SQL Fiddle demo .