2011-07-18 81 views
0

我試圖將數據從Excel電子表格導出到相當複雜的關係數據庫中。電子表格通過陳述其他對象的名稱來指示「外鍵」。 (幸運的是,我對電子表格有一些控制權,所以我可以保證這些名稱是唯一的,並且它們引用的對象實際上是存在的)。將外鍵添加到已存在的數據庫中

我有一個程序可以在MSSql數據庫中重新創建這些表,但它不能自動將它們鏈接到對方。另外,我不想使用對象的實際名稱作爲主鍵,因爲最終數據庫會很大。所以,如果我有很多現有的但是沒有連接的表通過它們的「名稱」字段相互引用,我怎麼能添加一個通過它們的ID鏈接它們的外鍵呢?

什麼,我有一個簡化版本:

Parent 
ID: 1 (PK) 
Name: Mary 

Child 
ID: 2 (PK) 
Name: Jane 
ParentName: Mary 

我想達到的目標:

Child 
ID: 2 (PK) 
Name: Jane 
ParentID: 1 (FK) 

感謝您的幫助!我無法找到如何在事實之後或在其他字段上添加外鍵映射的示例。

+0

這是一次性事情,還是您將不得不定期從此電子表格導入數據? –

+0

@Catcall:我必須定期做。 –

回答

4

查看MSSQL的ALTER TABLE語法。你能想出這樣的事情來約束添加到表:

ALTER Child 
ADD CONSTRAINT Child_Parent_FK FOREIGN KEY (ParentID) REFERENCES Parent(ID) 

然後,一旦約束是,你可以試試:

UPDATE Child 
SET ParentID = (SELECT ID FROM Parent WHERE Name = ParentName) 

這應該工作,如果你能保證Name父母是獨一無二的。否則,您可以將LIMIT 1添加到查詢的末尾。但是如果有多個父母使用相同的Name,則需要添加額外的邏輯(這在您的原始帖子中未指定)。

+0

這是如何回答這個問題的? – Olaf

+0

哦,是的。我想它是缺少一點。讓我再補充一點。 – Dirk

+0

我相信OP所面臨的問題是Excel電子表格包含父項的名稱,但數據庫表應包含父項的ID。 – Olaf

1

既然你會定期這樣做,我想你應該導入到一個臨時表。我喜歡在自己的模式中分離登臺表。

使用登臺表檢索或生成所需的密鑰,然後根據登臺表中的數據插入/更新OLTP表。最後,截斷登臺表。

+0

謝謝!這不是我原來的問題的直接答案,但這是我最終做的。 :) –

+0

這不是我的第一個牛仔競技表演。我知道回答問題和解決問題的區別。 (請參閱http://meta.stackexchange.com/q/66377/161666)我並不是要求積分,但是您可以對任何喜歡的答案進行積極評價,並且可以隨時更改您接受的答案。 –

+0

只要我獲得足夠的「聲譽」,我一定會立即贊同這一建議! :) –

相關問題