我试图在包含唯一序列号的其他表上插入数据库。我想用它作为其他表的外键。说明如下。希望你们给我一些建议,因为我很困惑,不知道如何应对。所以......
我有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中的序列号加载到其他临时表中? 任何消化? 提前致谢
答案 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块中循环,你可以把它放在循环中。