Как пакетная вставка в две таблицы с идентификатором чужого внешнего ключа? - PullRequest
0 голосов
/ 26 декабря 2018

Есть две таблицы.У пользователя таблицы есть столбцы, как показано ниже

ID,NAME,AGE

И у объекта таблицы есть столбцы, как показано ниже

ID,ID_USER,PRICE

ID_USER актива - это идентификатор пользователя.

Таблица В идентификаторе пользователя используется sequeceseq_t_user.Идентификатор табличного актива использует sequece 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 голосов
/ 26 декабря 2018

Хитрость заключается в том, чтобы использовать 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
;

Вот демонстрация SQL Fiddle .

0 голосов
/ 26 декабря 2018

Похоже, вам нужна "безусловная множественная вставка".

Я предполагал, что вы получите все значения из 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:Мы узнали, что мы не можем использовать последовательность в множественной вставке в операторе выбора.Поэтому мы переместили последовательность в часть вставки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...