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

Sql 表中的序列号作为其他表的外键。插入数据,sql,database,oracle,Sql,Database,Oracle,我试图在包含唯一序列号的其他表上插入数据库。我想用它作为其他表的外键。解释如下。希望你们能给我一些建议,因为我很困惑,不知道该怎么处理。所以 我有两个表,我想填写正确使用序列号。我希望简要说明我想做什么的示例: 我有一个序列名,例如sequenceid 我有样本表格填好了 Column1 234234 53451 54576 现在,我想在表1和表2中插入一些数据,这些数据部分基于sampleid表和use sequence Table1 COLUMN1 COLUMN2

我试图在包含唯一序列号的其他表上插入数据库。我想用它作为其他表的外键。解释如下。希望你们能给我一些建议,因为我很困惑,不知道该怎么处理。所以

我有两个表,我想填写正确使用序列号。我希望简要说明我想做什么的示例:

我有一个序列名,例如sequenceid

我有样本表格填好了

Column1
234234
53451
54576
现在,我想在表1和表2中插入一些数据,这些数据部分基于sampleid表和use sequence

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表中的数据

例如,表1和表2可以是:

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
如您所见,表2中的第一列包含表1中的sequenceId,第2列包含其他序列号(不相关),第4列包含sampleid表中的数据

现在,我不知道如何处理这个问题,我应该使用游标吗?但我如何从表1中引用序列号呢? 也许我应该将表1中的序列号加载到其他临时表中? 有什么建议吗?
提前感谢

很难说清楚您的意思,但是如果您将成对的行插入到两个表中,那么通常的方法是利用序列行为:

请注意,第一次插入使用
nextval
,第二次插入使用
currval
——只要您在同一会话中,就会重用通过
nextval
获得的最后一个值

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

insert into table2 (column1, column2, column3, column4)
values (sequenceid.currval, sequenceid.nextval, 'Something else', 234234);
看起来应该是这样的,但是在一个语句中,对
currval
的引用将使用该语句的
nextval
,因此您将在两列中插入相同的值。或者,如果没有违反外键约束,您也会这样做

我可以看到两种方法。第一种方法是使用第一个版本,首先将
table2.column2
设置为null,然后对其进行更新,这可能在完成所有插入后进行:

update table2 set column2 = sequenceid.nextval where column2 is null;
但是,如果
column2
不可为空,则这将不起作用

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

declare
  l_seq_value number;
begin
  l_seq_value := sequenceid.nextval;
  insert into table1 (column1, column2, column3)
  values (l_seq_value, 'text', 54576);
  insert into table2 (column1, column2, column3, column4)
  values (l_seq_value, sequenceid.nextval, 'Something else', 54576);
end;
/
如果要在PL/SQL块中循环,可以将其放入循环中


这两种方法都适用。

您是想同时将数据插入两个表中,还是已经将数据放在表1中,以后再尝试用相关数据填充表2?如果是这样,关系和其他数据来自哪里?为什么您有两个表?从您的示例来看,它看起来像一对一的关系,有重复的数据?如果我同时将数据插入两个表中,那么我将在两个表中都获得随机序列id。您询问了其他数据-这只是一个示例。我有两个表,我需要根据sampleid表填充它们。样本ID表中的数据应插入表1.column3和表2.column4。这当然很容易做到。下一步是在table1.column1中创建插入随机数(序列),并以某种方式使用从table1.column1到table2.column1OK的相同序列,但您是在table1中插入一行,然后在table2中插入一行,然后在table1中插入另一行,再在table2中插入一行;或者你是一次将许多行放入表1,然后将许多行放入表2?如果我只是将数据同时插入到2个表中,例如,插入到表1(sequence.neextval,'sdsd',number from sampleid(需要使用游标),然后插入到表2(sequence.nextvalue,'sdd'(…),结果我将得到两个不同的数字。不,我必须一次将许多行放入表1中。天哪,我忘记了使用序列曲线的可能性…明天早上我将尝试您的解决方案。非常感谢Alex的帮助:)Alex,我正在尝试将数据插入表值中(sequence1.nextval,sequence1.currval,sequence1.nextval),但输出是例如(5,5,5,)。有什么方法可以做例如(5,5,6)?@maciek2791-这正是我说的不可行的。你必须在单独的语句中设置列值(插入,然后更新);或使用变量跟踪。我已经展示了这两种方法。是的,它似乎工作得很好,你是对的:)再次感谢Alex:)
declare
  l_seq_value number;
begin
  l_seq_value := sequenceid.nextval;
  insert into table1 (column1, column2, column3)
  values (l_seq_value, 'text', 54576);
  insert into table2 (column1, column2, column3, column4)
  values (l_seq_value, sequenceid.nextval, 'Something else', 54576);
end;
/