Sql 在Oracle中如何将外键链接到自动递增的主键?

Sql 在Oracle中如何将外键链接到自动递增的主键?,sql,oracle,auto-increment,Sql,Oracle,Auto Increment,我有两个表,它们的公共字段是Load_ID。第一个表的PK与第二个表的FK有一对多的关系。例如: Table1: 1, someValue Table2: 1, value1, ... 1, value2, ... 1, value3, ... 我在ASP.NET类中嵌入了实际的insert语句,其中的值取自用户输入: "INSERT INTO Compare_Header_Table VALUES (compare_sequence.nextval, //other values

我有两个表,它们的公共字段是Load_ID。第一个表的PK与第二个表的FK有一对多的关系。例如:

Table1:
1, someValue

Table2:
1, value1, ...  
1, value2, ... 
1, value3, ... 
我在ASP.NET类中嵌入了实际的insert语句,其中的值取自用户输入:

 "INSERT INTO Compare_Header_Table VALUES
(compare_sequence.nextval, //other values are inserted here)
我用来自动增加PK的序列是
createsequencecompare\u序列
这似乎在不创建触发器或指定任何参数的情况下也能正常工作,因为序列默认为增量1和初始值1,这对于我来说很好

我遇到问题的地方是试图将第二个表的FK链接到第一个表的PK。我不能简单地使用
compare\u sequence.currval
,因为我有一个单独的方法插入到每个表中,所以每次我都创建一个新连接。我不想将这些合并到一个方法中,因为这将涉及更改我的C#类的逻辑结构,我宁愿保持原样


有什么建议可以让这项工作顺利进行吗

如果希望在单独的会话中执行
INSERT
操作,则需要从第一条语句中检索生成的键,并将其传递给将数据插入
表2
的方法。在不需要数据库往返的情况下检索生成的密钥的一种方法是执行以下操作

INSERT INTO compare_header_table
  VALUES( compare_sequence.nextval,
          ... )
 RETURNING name_of_primary_key_column
      INTO :bind_variable

如果希望在单独的会话中执行
INSERT
操作,则需要从第一条语句中检索生成的键,并将其传递给将数据插入
表2
的方法。在不需要数据库往返的情况下检索生成的密钥的一种方法是执行以下操作

INSERT INTO compare_header_table
  VALUES( compare_sequence.nextval,
          ... )
 RETURNING name_of_primary_key_column
      INTO :bind_variable

您可以使用返回原因获取指定的值:

 INSERT INTO Compare_Header_Table (ID) VALUES
        (compare_sequence.nextval)
 returning id into some_value;
这个
some_值
是一个局部变量,您需要将它从第一个类传递出去,然后交给第二个类。如何准确地做到这一点取决于您的体系结构

顺便说一句,我希望当你说“我每次都在创建一个新的连接”时,这是一些c#行话,而不是每次都在创建一个新的数据库连接。因为那是一个相当昂贵的手术


另一件事是,如果您在创建父记录和子记录的不同会话中,事务会发生什么变化?您必须提交每个插入(否则,当您尝试插入子项时,外键验证将看不到新的父记录)

您可以使用返回原因获取指定值:

 INSERT INTO Compare_Header_Table (ID) VALUES
        (compare_sequence.nextval)
 returning id into some_value;
这个
some_值
是一个局部变量,您需要将它从第一个类传递出去,然后交给第二个类。如何准确地做到这一点取决于您的体系结构

顺便说一句,我希望当你说“我每次都在创建一个新的连接”时,这是一些c#行话,而不是每次都在创建一个新的数据库连接。因为那是一个相当昂贵的手术


另一件事是,如果您在创建父记录和子记录的不同会话中,事务会发生什么变化?您必须提交每个插入(否则,当您尝试插入子项时,外键验证将看不到新的父记录)

对于本应在单个事务中插入的内容,您不应使用单独的连接。@一个名称为“无”的“马”,很好知道,以备将来参考。最初我只是将它插入一个表中,但后来它被拆分为两个。现在一次完成所有插入操作将涉及到一些我宁愿避免的重大重组。对于本应在单个事务中进行的插入操作,您不应该使用单独的连接。@a_horse_,带有_no_名称,这很好,以备将来参考。最初我只是将它插入一个表中,但后来它被拆分为两个。现在一次完成所有的插入将涉及到一些我宁愿避免的重大重组。嗯,好吧,在那种情况下,我可能需要考虑修改我的C代码。嗯,好吧,在那种情况下,我可能需要考虑修改我的C代码。