2014-05-08 79 views
1

我不認爲我可以在關於我的問題的標題中具體。讓我這樣說,遠離談論項目的內容。如何將主鍵值分配給外鍵?

我在我的數據庫中有很多表,其中兩個是PersonsAddress。需要規範化並設置這兩個實體之間的多對多關係,我不保留這些表中的任何外鍵相互引用。例如,我不存儲外鍵到Address表中,在Person表中

而是,我的外鍵位於名爲PersonAddress的第三個表中。此表包括什麼,但只有兩個外鍵在自己的表引用的主鍵(PersonAddress

在Microsoft SQL Server,我們掛有問題的表到其他兩個,使得表的屬性(PersonId, AddressId)另外兩個表名爲PersonAddress外鍵,允許刪除和更新級聯操作。 (反正)

在第一次,它似乎會工作得很好。但是,一旦我們繼續向數據庫輸入數據,就會發現外鍵值在第三個表中保持不變,我們可以在這兩個表中看到每個主鍵值Person和Address

任何幫助將不勝感激,謝謝提前爲您的未來嘗試,傢伙。

+1

您已經添加ON DELETE CASCADE ON UPDATE CASCADE而定義的外鍵? – Deepshikha

+0

你能澄清你正在執行什麼聲明,你認爲應該是什麼效果? – Lennart

回答

3

您做了正確的事情來創建中間表以創建多對多關係,並且它按預期工作。在PersonAddress表

  • SQL服務器將不會自動刪除相關項目,但這樣自己
  • 我會把主鍵上橫跨兩個其他ID的表,如果您還沒有這樣做會失敗 - 讓他們都作爲FK也是如此。

請澄清這個問題,如果它沒有回答它。

+0

確保你看看DeepShikha的答案......看起來你可能可以級聯更新和刪除。 – Ruskin

1

要反映或級聯在父表中引用列中完成的更改(即,如果更改了父表的主鍵列中的值),還要反映在子表中(即,您希望在子表外鍵鍵列也被更新爲相同的值),您應該在定義外鍵時添加Cascade選項。

爲:

create table PersonAddress 
    ( 
    PersonId int 
    , AddressId int 
    ,CONSTRAINT FK_PersonId Foreign key (PersonId) 
    references Person(id) ON UPDATE CASCADE ON DELETE CASCADE 
    ,CONSTRAINT FK_AddressId Foreign key (AddressId) 
    references Address(id) ON UPDATE CASCADE ON DELETE CASCADE 
    ); 

正如你已經到位表定義修改外鍵約束,我們必須首先刪除現有外鍵約束,然後再用新的定義重新創建它。 所以,寫爲:

IF EXISTS (SELECT * FROM sys.objects 
WHERE name = 'FK_PersonId' AND [type] = 'F') 
ALTER TABLE PersonAddress 
DROP Constraint FK_PersonId 

GO 

ALTER TABLE PersonAddress 
ADD CONSTRAINT [FK_PersonId] 
FOREIGN KEY (PersonId) REFERENCES Person(id) 
ON DELETE CASCADE ON UPDATE CASCADE 
GO 

您可以檢查試運行here