2012-06-02 46 views
2

我有一個具有自動增量代理鍵的表。我想用它作爲另一個表的外鍵。事情是,我不知道如何將它引用到該表中,因爲幾乎不可能確定我必須引用的內容(代理鍵的實際值)。引用代理鍵

請注意,我想要做的是通過我的程序(在dbms之外)添加元組/記錄。過程如下:

  1. 在Table1中添加新記錄並生成自動增量密鑰。更新

  2. 在Table2中添加一條新記錄並將其外鍵引用到Table1的主鍵。更新

我的問題是:如果我不知道它是什麼,我如何存儲外鍵?

編輯:

對不起,不指定數據庫和長期的答覆。我使用微軟的SQL服務器。

+0

您正在使用哪些RDBMS? – 2012-06-02 22:13:45

+0

這取決於您正在使用的數據庫。你沒有指定 - MySQL,Oracle還是什麼? – codingbiz

+0

微軟sql server – Arman

回答

1

如果你的數據庫管理系統支持序列(大多數現代數據庫管理系統都是這樣做的),只需爲table1生成PK值,然後使用DBMS的「currval」功能引用該FK值。

喜歡的東西(PostgreSQL的語法,但其他DBMS支持序列具有非常類似的功能):

INSERT INTO table1 (id, col1, col2) 
VALUES (nextval('id_sequence'), 'foo', 'bar'); 

INSERT INTO table2 (t1_id, col1) 
VALUES (currval('id_sequence'), 'foobar'); 

另一種選擇是簡單地讓你的程序的ID值,然後在兩個刀片使用該值。

如果您不得不處理不支持序列的數據庫管理系統(例如2012年之前的MySQL或SQL Server),通常會有一個函數(例如SQL Server的@@IDENTITY),它允許您參考生成的表1的ID值第二個INSERT語句(而不是currval調用)

+0

哇,非常快的回覆。我會檢查@@ IDENTITY,我相信這是最好的解決方案。謝謝! – Arman

1

既然你沒有提到你的數據庫軟件的名稱,因爲你的問題似乎並不怎麼申報代理鍵,您可以:

  1. 設置表2中的外鍵在表1中可以爲空,所以你可以在表2中記錄的關鍵字已經確定後更新它。
  2. 先保存表2中的記錄,然後保存表1中的記錄,引用表2中新保存的記錄。這樣,您不必將表1中表2的外鍵聲明爲可爲空,並且會是這樣做的首選方式。