вставить все и внутреннее соединение в оракуле - PullRequest
0 голосов
/ 24 августа 2018

Я хотел бы вставить данные в две таблицы. Будет соединение один ко многим. Для этого мне, конечно, нужно использовать Foreign Key.

Думаю, столбец table1 - ID является идеальным для этого первичного ключа. Но я генерирую его всегда с помощью триггера, автоматически, каждой строки. ТАК, Как поместить столбец Table1.ID (автоматически сгенерированный, первичный ключ) в столбец table2.Fkey в том же запросе вставки?

INSERT ALL INTO table1 (   --here (before this) generated the table1.id column automatically with a trigger.
    table1.food,
    table1.drink,
    table1.shoe
) VALUES (
    'apple',
    'water',
    'slippers'
)
 INTO table2 (
    fkey,
    color
) VALUES (
    table1.id, -- I would like table2.fkey == table1.id this gave me error
    'blue'
) SELECT
    *
  FROM
    table1
    INNER JOIN table2 ON table1.id = table2.fkey;

Сообщение об ошибке: "00904. 00000 - "%s: invalid identifier""

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Поскольку вы используете версию Oracle DB 12c, то можете использовать Identity Column Property. Затем легко вернуть значение первой таблицы ( table1 ) в локальную переменную, взимая предложение returning сразу после оператора вставки для table1 , и использовать внутри следующего оператора вставки, который для table2 , как указано ниже:

SQL> create table table1(
  2                      ID    integer generated always as identity primary key,
  3                      food  varchar2(50), drink varchar2(50), shoe varchar2(50)
  4                      );

SQL> create table table2(
  2                      fkey  integer references table1(ID),
  3                      color varchar2(50)
  4                      );

SQL> declare
  2    cl_tab table1.id%type;
  3  begin
  4    insert into table1(food,drink,shoe) values('apple','water','slippers' )
  5    returning id into cl_tab;
  6    insert into table2 values(cl_tab,'blue');
  7  end;     
  8  /

SQL> select * from table1;

ID  FOOD    DRINK   SHOE
-- ------- ------- -------
 1  apple   water  slippers

SQL> select * from table2;

FKEY COLOR
---- --------------------------------------------------
   1 blue

Каждый раз, когда вы вводите вышеприведенный оператор для вставок между begin и end , оба столбца table1.ID и table2.fkey будут заполнены одинаковыми целочисленными значениями. Кстати, не забудьте зафиксировать изменения путем вставки, если вам нужны эти значения во всей БД (например, из других сессий).

0 голосов
/ 24 августа 2018

Как предложено @OldProgrammer, используйте последовательность

INSERT ALL INTO table1 (   --here (before this) generated the table1.id column automatically with a trigger.
    table1_id,
    table1.food,
    table1.drink,
    table1.shoe
) VALUES (
    <sequecename_table1>.nextval,
    'apple',
    'water',
    'slippers'
)
 INTO table2 (
    fkey,
    color
) VALUES (    
    <sequecename_table2>.nextval,
    <sequecename_table1>.currval, -- returns the current value of a sequence.
    'blue'
) SELECT
    *
  FROM
    table1
    INNER JOIN table2 ON table1.id = table2.fkey;
...