当前位置: 首页 > 知识库问答 >
问题:

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

柴彬
2023-03-14

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

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

我有序列名称,例如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中的序列号加载到其他临时表中?有什么建议吗?提前谢谢

共有1个答案

宗政洋
2023-03-14

很难准确地说出您的意思,但是如果您将成对的行一起插入到两个表中,那么您的正常方法将是使用具有nextvalcurrval伪列的序列行为:

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-只要您在同一个会话中,这将重用通过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块中循环,可以将其放入循环中。

两种方法的快速SQL FIDLE演示。

 类似资料:
  • 问题内容: 我有下表,其中的表是空的,我正在尝试填充: 要填充的源数据是我从外部CSV文件填充的临时表: 我想做的是用中的值填充。该字段可以直接复制,但是我不太确定如何获取正确的内容(可以使用tmp_table.langname确定language.id)和(tmp_table.tplname,tmp_table.source,tmp_table.domain一起使用)确定template.id)

  • 长度为10的哈希表使用带有哈希函数h(k)=k mod 10的开放寻址和线性探测。在向空哈希表中插入8个值后,该表如下所示 使用同一哈希函数和线性探测的键值的多少个不同插入序列将产生如上所示的哈希表? 答案是128。 我知道91,2,13,24,77是5!=120但我不知道其他8种组合是什么?

  • 问题内容: 在PostgreSQL中,我有一个数据库,我打算进行以下表声明: 一切正常,除了在创建最后一个表(更正)时出现以下错误: 错误:没有唯一的约束匹配给定键的引用表“提交” 我对更正表的打算是对每个提交都有唯一的更正,但是一个提交可以(也可以不)具有更正。 我该如何解决这个错误?是设计问题还是表声明错误? 问题答案: 外键约束不关心所引用的列是否在引用另一列本身。但是引用的列 必须 是唯一

  • 问题内容: 这是我正在查看的表的简化版本: 我想在此表中插入新记录。我尝试了3种方法: 这种方法会插入,但是生成的键与表中的其他键不同,不是一个很好的顺序GUID 这失败并显示错误 newsequentialid()内置函数只能在CREATE TABLE或ALTER TABLE语句中的’uniqueidentifier’类型的列的DEFAULT表达式中使用。它不能与其他运算符组合以形成复杂的标量表

  • 问题内容: 我有一个列表,例如:thing1,thing2,thing3。我想将它们插入具有相同外键的查找表中。因此理想情况下,它看起来应该像这样: 看来完成此操作的唯一方法是将列表转换为查询,但是我想知道,是否有更简单的方法? 这是我尝试过的: 我听说您无法在cfquery中执行cfloop,但是我什至不确定这是否成立,因为VALUES中没有逗号,并且我不确定如何说“ cfloop中的“当前迭代

  • 问题内容: 我在蜂巢中有一张桌子,两列分别为和。输出如下图 我想按升序对该col2进行排序,并且col1还应相应地更改其索引,例如 问题答案: 分解两个数组,进行排序,然后再次聚合数组。在子查询中使用之前对数组进行排序: 结果: 编辑:同一脚本的简化版本,您可以不用第二次posexplode,而是按位置使用直接引用