表中的序列号作为其他表的外键。插入数据

时间:2015-10-28 15:04:36

标签: sql database oracle

我试图在包含唯一序列号的其他表上插入数据库。我想用它作为其他表的外键。说明如下。希望你们给我一些建议,因为我很困惑,不知道如何应对。所以......

我有2个表,我想使用序列号正确填写。我希望简要解释一下我想做什么的例子:

我有序列,例如。的 sequenceid

我已填充 sampleid 表格,例如

Column1
234234
53451
54576

现在我想在Table1和Table2中插入部分基于sampleid表和使用序列的数据

Table1 

COLUMN1        COLUMN2     COLUMN3
sequenceid   'Somedata'    234234   -> from sampleid table
sequenceid   'Somedata2'   53451    -> from sampleid table
sequenceid   'Somedata3'   54576    -> from sampleid table




Table2 

COLUMN1                                COLUMN2    COLUMN3          COLUMN4
ID from table1.column1 as Foreign Key sequenceid 'Something else'   234234
ID from table1.column1 as Foreign Key sequenceid 'Something else'   53451
ID from table1.column1 as Foreign Key sequenceid 'Something else'   54576

如您所见,第4列也包含来自sampleid表的数据。

因此,例如table1和table2可以看起来:

Table1
   COLUMN1 COLUMN2  COLUMN3
    234    'text'    234234
    456    'text'    53451
    125    'text'    54576

Table2
    COLUMN1   COLUMN2 COLUMN3           COLUMN4  
    234         567   'Something else'   234234
    456         345   'Something else'   53451
    125         534   'Something else'   54576

如您所见,Table2中的第一列包含Table1中的sequenceId,Column2包含其他序列号(不相关),Column4包含来自sampleid表的数据。

现在,我不知道如何处理,我应该使用光标吗?但是我怎么能从Table1中引用序列号呢? 也许我应该将Table1中的序列号加载到其他临时表中? 任何消化? 提前致谢

1 个答案:

答案 0 :(得分:2)

很难说出你的意思,但是如果你将两对行一起插入两个表中,那么通常的做法就是利用{{3}的序列行为。 }:

insert into table1 (column1, column2, column3)
values (sequenceid.nextval, 'text', 234234);
insert into table2 (column1, column2, column3, column4)
values (sequenceid.currval, null, 'Something else', 234234);

请注意,第一个插页使用nextval,第二个插页使用currval - 只要您在同一个会话中,就会重复使用{{1}获得的最后一个值}。

但在您的情况下,您希望使用相同的序列在第二个表中设置另一列;这不起作用:

nextval

看起来应该如此,但在声明中,对insert into table2 (column1, column2, column3, column4) values (sequenceid.currval, sequenceid.nextval, 'Something else', 234234); 的引用将使用该声明的currval,因此您可以获得相同的值进入两列。或者,如果没有违反外键约束,你就会这样做。

我可以看到两种方法。第一个是使用第一个版本,最初将nextval设置为null然后更新它,这可能在所有插入完成后完成:

table2.column2

如果update table2 set column2 = sequenceid.nextval where column2 is null; 不可为空,那将无法工作。

第二种方法是使用PL / SQL来保留生成的值,如果你已经真正使用了游标循环,这可能对你有用:

column2

如果你在PL / SQL块中循环,你可以把它放在循环中。

the nextval and currval pseudocolumns这两种方法。