2013-02-19 47 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