2

我有一个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.. type_id 3 和 4 中有 2 个新行。

如何填充TABLEB自动使用中不存在的数据TABLEA?我希望TABLEB自动插入所有列。

因此,如您所见:

  • SEQ_ID将是连续的
  • ORDER值为 1 时,NAME值为“显示”,值为LEVEL7
  • 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

任何帮助表示赞赏!

4

2 回答 2

0

所以这可以在纯 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 是关键字:您不能将它们用作列名。

于 2014-06-06T06:23:03.507 回答
0

您可以:

  1. 让您的应用程序代码填充两个表,即:将适当的记录插入到两个表中。

  2. (听起来你倾向于)让 Oracle 做幕后工作,即:OracleTABLEB为你做 INSERT。做到这一点的方法是在TABLEA. 这是一个可以帮助您入门的示例: https ://stackoverflow.com/a/13356277/1680777

有些人会告诉您,TRIGGER 可能会使调试变得困难,因为您的部分逻辑在数据库中。这种批评是有道理的。我不会说总是/从不使用触发器。在有意义的地方使用它们:它们提供的价值超过了它们的复杂性。

于 2014-06-05T22:48:25.773 回答