[英]Oracle 12c - Insert values in a table using values from another table
我有一个表( TABLEA
)像这样:
type_id level
1 7
2 4
3 2
4 5
另一个表( TABLEB
)像这样:
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
TABLEB.TYPE_ID
是FK到TABLEA.TYPE_ID
。 目前,我正在手动在TABLEB
输入数据。
我在TABLEA
有2个新行.. type_id 3和4。
如何使用TABLEA
自动填充TABLEB
不存在的数据? 我希望TABLEB
所有列都可以自动插入。
因此,如您所见:
SEQ_ID
将是顺序的 ORDER
值为1时, NAME
值为“ display”,而LEVEL
则为7 ORDER
值为2时, NAME
值为“ header” ORDER
值为3时, NAME
值为“详细信息” 我期望插入后:
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
中执行INSERT。 做到这一点的方法是在TABLEA
上创建一个TRIGGER。 这是一个可能使您入门的示例: https : //stackoverflow.com/a/13356277/1680777
有人会告诉您,TRIGGER可能会使调试困难,因为您的逻辑的一部分在数据库中。 这种批评是有道理的。 我不会说总是/从不使用触发器。 在有意义的地方使用它们:它们提供的价值超过其复杂性。
因此,这可以在纯SQL中完成:INSERT ALL,它使我们可以在同一条语句中发出多个插入。
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)作为复合主键,但这也不好。
顺便说一下,ORDER和LEVEL是关键字:您不能将它们用作列名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.