Sql Oracle 12c-使用另一个表中的值在表中插入值
我有一个表(Sql Oracle 12c-使用另一个表中的值在表中插入值,sql,oracle,oracle12c,Sql,Oracle,Oracle12c,我有一个表(TABLEA)如下: 还有另一个表(TABLEB)如下所示: TABLEB.TYPE\u ID是FK到TABLEA.TYPE\u ID。目前,我正在手动在表B中输入数据 我在表A中新增了两行。。类型_id 3和4 如何使用表格A自动填充表格B中不存在的数据?我希望自动插入表B中的所有列 如你所见: SEQ_ID将是连续的 当顺序值为1时,名称值将“显示”,而级别将为7 当ORDER值为2时,NAME值将为“header” 当ORDER值为3时,NAME值将为“detail” 我期
TABLEA
)如下:
还有另一个表(TABLEB
)如下所示:
TABLEB.TYPE\u ID
是FK到TABLEA.TYPE\u ID
。目前,我正在手动在表B
中输入数据
我在表A中新增了两行。。类型_id 3和4
如何使用表格A
自动填充表格B
中不存在的数据?我希望自动插入表B
中的所有列
如你所见:
SEQ_ID
将是连续的
- 当
顺序
值为1时,名称
值将“显示”,而级别
将为7
- 当
ORDER
值为2时,NAME
值将为“header”
- 当
ORDER
值为3时,NAME
值将为“detail”
我期待在插入之后:
seq_id type_id name order level
1 1 display 1 7
2 1 header 2
3 1 detail 3
4 2 display 1 4
5 2 header 2
6 2 detail 3
7 3 display 1 2
8 3 header 2
9 3 detail 3
10 4 display 1 5
11 4 header 2
12 4 detail 3
感谢您的帮助 您可以:
让您的应用程序代码填充两个表,即:将适当的记录插入到两个表中
(听起来你倾向于)让Oracle在幕后完成工作,即:Oracle为你在TABLEB
中插入内容。方法是在表a
上创建触发器。下面是一个可能让您开始学习的示例:
有些人会告诉您,触发器可能会使调试变得困难,因为您的部分逻辑在数据库中。这种批评有些道理。我不会说总是/从不使用触发器。在它们有意义的地方使用它们:它们提供的价值超过其复杂性 因此这可以在纯SQL:INSERT-ALL中完成,它允许我们在同一条语句中发出多个INSERT
insert all
into tableb (seq_id, type_id, name, order_id, level_id)
values(tableb_id_seq.nextval, type_id, 'display', 1, level_id)
into tableb (seq_id, type_id, name, order_id)
values(tableb_id_seq.nextval+1, type_id, 'header', 2)
into tableb (seq_id, type_id, name, order_id)
values(tableb_id_seq.nextval+2, type_id, 'detail', 3)
select a.type_id, a.level_id from tablea a
minus
select b.type_id, b.level_id from tableb b
/
对序列的操作有点滑稽:它是必需的,因为对NEXTVAL的每次调用都会在一条语句中返回相同的值。显然,为了实现这一点,序列需要增加三个:
create sequence tableb_id_seq increment by 3;
这可能足以排除这种做法。作为替代,您可以使用(SEQ_ID,ORDER_ID)作为复合主键,但这也不好
顺便说一下,顺序和级别是关键字:不能将它们用作列名
insert all
into tableb (seq_id, type_id, name, order_id, level_id)
values(tableb_id_seq.nextval, type_id, 'display', 1, level_id)
into tableb (seq_id, type_id, name, order_id)
values(tableb_id_seq.nextval+1, type_id, 'header', 2)
into tableb (seq_id, type_id, name, order_id)
values(tableb_id_seq.nextval+2, type_id, 'detail', 3)
select a.type_id, a.level_id from tablea a
minus
select b.type_id, b.level_id from tableb b
/
create sequence tableb_id_seq increment by 3;