2010-02-08 40 views
1

工具:SQL2000/5/8,.NET 3.5,C#修復外鍵的問題與舊的數據庫

我所遇到的這兩個表的應用程序。在「代碼」的表格如下所示:

TABLE1(1 - N)TABLE2

所以表1(T1)具有一個Id:IDT1和表2(T2)具有其ID(IDT2)一個外鍵t2.IdT1

這個1.N關係是代碼強制執行到一定程度。無論如何,DB中都沒有FK。 (設計這個的人沒有增加限制,也沒有任何類似的東西)。

問題是,我發現應用程序使用TABLE2中的IdT1(正確)在TABLE1,上存儲引用的行,但也使用零(0)作爲特殊情況。

所以我(在表2)沿着這些路線的東西:

IDt2 IdT1 OtherFields 
1 1 x 
2 1 x 
3 5 x 
4 0 x 
5 3 x 
6 0 x 
… 

如您在行4和6個的FK點看到在TABLE1不存在的行。該軟件的工作原理是因爲它有很多地方可以用IF語句或類似語句「跟蹤」這個地方。現在改變它並不是一個好主意(我不想接觸那些「有效並且我現在沒有寫」的代碼),除非這是唯一的方法。

現在我修改應用程序的其他方面,我需要數據庫有FKS(我們autogenerating代碼模板,如果FKS是不存在的,有些事情就不會發生) 。

鑑於上述情況,有沒有什麼辦法可以創建一個不檢查約束「永遠」的FK?這是否會成爲一個「問題」(考慮到該應用程序已經在FK中使用Id = 0的方式工作了5年以上)?你有什麼建議嗎?韓國社交協會。

回答

2

通常,外鍵約束的唯一目的是檢查外鍵是否存在於主鍵表中。如果你不想這麼做,那你爲什麼要那麼做呢?

一種解決方案是在主密鑰表中添加一個魔術行,零PK,然後添加FK約束。這不是純粹主義方法的推薦解決方案,但考慮到您在問題中指定的限制,可能是最佳解決方案。

+0

感謝您的洞察力。我已經決定刪除​​FK(因爲正如你所說,它的目的已經被擊敗)並且使用代碼。魔法排是誘人的,但我寧願不採取魔法路線;) – 2010-02-08 16:04:41

1

如果你想創建一個FK,並且你不想檢查existing數據,你可以使用WITH NOCHECK ...但是在這種情況下,你只是擊敗了FK的全部目的。還應該意識到,使用NOCHECK定義的約束不被查詢優化器考慮

+0

感謝SQLMenace,不幸的是NOCHECK會 - 正確地指出 - 只檢查**現有的**數據。鑑於數據並不真正公平,我決定刪除FK。 – 2010-02-08 16:05:31