如何将一个人的ID批量插入两个表是另一个人的外键?

时间:2018-12-26 05:25:05

标签: sql oracle

有两个表。表用户具有以下列

ID,NAME,AGE

表资产具有以下列

ID,ID_USER,PRICE

资产的ID_USER是用户的ID。

表用户的ID使用序列seq_t_user。 表格资产的ID使用序列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 个答案:

答案 0 :(得分:2)

您似乎需要“无条件多表插入”。

我假设您从my_table中获取了所有值,但是您可以根据需要进行修改;

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

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

答案 1 :(得分:2)

诀窍是使用INSERT ALL。这使我们可以从一个SELECT来源填充多个表。我的示例使用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