1

我有兩個表(MS SQL Server 2005)與現有的應用程序(沒有數據庫的變化,除了索引等允許)。適用於沒有UNIQUE約束的MS SQL Server 2005的正確外鍵?

兩個表是:

ActivityDetails (Primary table) 
    ActivityDetailkey (Primary key) 

SubActivities (Child table) 
    ActivityDetailKey (Refers to ActivityDetails) 

現在,還有爲ActivityDetailKeySubActivities沒有約束上。基本上,對於每個ActivityDetail行,可以有許多行,並且沒有任何東西阻止用戶刪除行並將SubActivities孤立起來。

應用程序中應該有一些「軟鎖」,它可以防止這種情況發生,但它不起作用,我也希望在數據庫層中提供一些更好的完整性。

但我似乎無法添加外鍵,因爲SubActivitiesActivityDetailKey列不是唯一的。

如果有孩子在場,我該如何防止人們刪除ActivityDetails行?

感謝

編輯

我的道歉的複雜性。 SubActivities表實際上被命名爲TEDetailSubActivities。我在問題中改變了它,以便閱讀更容易。

但無論如何,這裏是兩個表的完整模式的要點。

https://gist.github.com/840479

我感謝所有幫助。

+0

我試過這兩種方法,我得到:「表SubActivities中的列不匹配現有的主鍵或UNIQUE約束。」多謝你們。 – cbmeeks 2011-02-23 13:44:39

+0

請問ActivityDetails的* exact *模式是什麼? – gbn 2011-02-23 13:49:17

+0

我無法在SQL Server 2005中重現您的錯誤消息 - 如果ActivityDetails中沒有PK,或者它是不同的PK,我會收到消息:「在引用表'ActivityDetails'中沒有匹配的主鍵或候選鍵。 ..「 – 2011-02-23 13:56:45

回答

2

這聽起來像你想圍繞建立你的外鍵錯誤的方式 - 如果在具有相同ActivityDetailKey值的子活動多行,而這些都是在ActivityDetails主鍵引用,那麼下面的應工作(根據您的發佈模式,現在測試):

ALTER TABLE TEDetailSubActivities ADD CONSTRAINT FK_TEDetailSubActivities_ActivityDetails FOREIGN KEY 
     (ActivityDetailKey) references dbo.ActivityDetails (ActivityDetailKey) 

以前版本的基礎上,在後期的表名:

ALTER TABLE SubActivities ADD CONSTRAINT FK_SubActivities_ActivityDetails FOREIGN KEY 
     (ActivityDetailKey) references ActivityDetails (ActivityDetailKey) 

有在子活動的ActivityDetailKey列中沒有唯一性要求。

按原樣,如果SubActivities中有引用它們的行,它將停止從ActivityDetails刪除行。另一方面,如果您希望應用程序能夠繼續刪除操作,但要避免在SubActivities中留下孤行行,請在上面最後一個右括號後面添加ON DELETE CASCADE


上述工作基於下列表格定義。如果它不能在你的數據庫的工作,你需要幫助我們通過數據庫發佈,要麼是實際表定義,或者說「足夠接近」讓我們模仿你所看到的:

create table ActivityDetails (
    ActivityDetailkey int not null Primary key 
) 
go 
create table SubActivities (
    ActivityDetailKey int not null 
) 
go 

感嘆。如果你要堅持使用SSMS設計師:

  • 右鍵單擊SubActivities,選擇「設計」。
  • 按「關係」工具欄按鈕
  • 按「添加」
  • 按「......」對‘表和列規範’屬性
  • 在‘主鍵表’下拉菜單,選擇「 ActivityDetails」
  • 在下面的網格中,選擇ActivityDetailKey兩側
  • 按‘OK’,‘關閉’,‘保存’工具欄按鈕,(如果需要)‘是’保存警告
  • 關閉設計師。
+0

我們用同樣的想法在同一時間發佈了答案! – jorgebg 2011-02-23 13:31:56

2

你可以有一個外鍵,即使其複製子表上,你應該添加約束WITH CHECK選項,例如:

ALTER TABLE [dbo].[SubActivities] WITH CHECK ADD CONSTRAINT [FK_SubActivities_ActivityDetails] FOREIGN KEY([ActivityDetailkey]) 
REFERENCES [dbo].[ActivityDetails ] ([ActivityDetailkey]) 

希望它能幫助!