2013-02-19 74 views
1

我有两个表,其公共字段是Load_ID。第一个PK与第二个的FK有一对多的关系。例如:如何将外键链接到Oracle中自动递增的主键?

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是CREATE SEQUENCE compare_sequence; 这似乎工作,即使没有创建一个触发器或指定任何参数,因为该序列默认为1的增量和初始值为1,这是我的目的罚款。

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

有关如何使这项工作的任何建议?

+4

您不应该使用单独的连接插入应该在单个事务中。 – 2013-02-19 16:55:03

+0

@a_horse_with_no_name这是很好的知道以备将来参考。原来我只是把它插入一张桌子,但后来它分成两部分。现在,所有插入操作都会涉及一些我宁愿避免的重大重组。 – user1985189 2013-02-19 17:06:08

回答

1

如果你想INSERT操作在单独的会话来完成,你需要检索的第一条语句生成的密钥,并把它传递给数据插入到table2方法。检索生成的密钥,无需数据库往返的一种方式是像做

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

你可以做的是使用returning事业获得分配的值:

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

some_value是一个局部变量,你需要将你的第一课传递给第二课。你做得到的确切程度取决于你的架构。

顺便说一句,我希望当你说'我每次创建一个新连接'时,这是一些c#行话,并且你并不是真的每次都创建一个新的数据库连接。因为这是一个非常昂贵的操作。

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

+1

嗯,好吧,也许我将不得不考虑修改我的C#代码。 – user1985189 2013-02-19 17:09:09