1

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

Table1:
1, someValue

Table2:
1, value1, ...  
1, value2, ... 
1, value3, ... 

我已经在一个 ASP.NET 类中嵌入了实际的插入语句,其中的值取自用户输入:

 "INSERT INTO Compare_Header_Table VALUES
(compare_sequence.nextval, //other values are inserted here)

我用来自动增加 P​​K 的序列是CREATE SEQUENCE compare_sequence; 即使没有创建触发器或指定任何参数,这似乎也可以工作,因为序列默认为增量 1 和初始值 1,这对我的目的来说很好。

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

关于如何完成这项工作的任何建议?

4

2 回答 2

3

您可以做的是使用 RETURNING 原因来获取分配的值:

 INSERT INTO Compare_Header_Table (ID) VALUES
        (compare_sequence.nextval)
 returning id into some_value;

some_value是一个局部变量,您需要将其从第一堂课传递到第二堂课。你这样做的精确程度取决于你的架构。

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

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

于 2013-02-19T16:57:55.733 回答
1

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

INSERT INTO compare_header_table
  VALUES( compare_sequence.nextval,
          ... )
 RETURNING name_of_primary_key_column
      INTO :bind_variable
于 2013-02-19T16:56:03.523 回答