2011-12-13 338 views
0

我有一個已經存在的具有表格的數據庫。我爲其中一個表添加了外鍵關係(因爲它們引用了另一個表中的數據,只是該關係在創建表的方式上並不明確)。SQL Server - 添加外鍵關係

此更改如何影響現有數據庫?數據庫引擎是否必須對數據庫中的現有數據做一些額外的工作?如果您已經擁有使用當前數據庫架構的應用程序,此更改可以成爲「重大更改」嗎?

+0

如何在數據庫中添加「現有數據」?它已經不是嗎? – Bart

+0

@bart是的數據已經存在。只是在主 - 外關係沒有明確之前 – Ghita

+0

Sql server(2005和2008) – Ghita

回答

1

如果您添加了引用約束,那麼數據庫將存儲該約束並確保其保持不變。例如,如果表A具有涉及表B的外鍵,則不能在表A中插入一行來引用表B中不存在的鍵。

+0

是的,但是在我已經擁有數據之後應用這種關係。服務器會檢查每個表格元素以確保關係正確嗎? – Ghita

+1

@Ghita:是的,SQL Server會爲你做這件事(除非你明確地告訴它) –

+0

正如@marc_s所說的,你通常不能應用一個首先被打破的約束。你首先需要修復數據。 – Gigi

1

確實有一些額外的工作最小限度,取決於您的數據庫服務器)來強制引用完整性。在實踐中,性能影響幾乎不會被你注意到。

它可能是一個「重大變化」 - 您的客戶端代碼可能會插入不符合參照約束的數據。如果數據庫允許您首先創建約束條件,則不太可能,但這是可能的。

+0

添加引用約束後,我在sql服務器實例中看到高活動。我無法確切地說,但可能是因爲服務器在更改後檢查完整性?這是一個非常大的數據庫.. – Ghita

+0

索引了主鍵和外鍵列嗎?在底層,SQL Server幾乎可以肯定地做一個「select * from parent table where primary_key = ????」爲每個插入/更新。 –

+0

主要是索引主鍵。外鍵沒有索引。 – Ghita

1

創建一個外鍵約束時,您可以指定WITH NOCHECK

WITH NOCHECK選項是有用的,當現有的數據已經滿足 新FOREIGN KEY約束,或者當業務規則要求 約束強制執行只有從這一點出發。

但是,當添加約束時,您應該小心,而不檢查現有數據,因爲這會繞過執行表的數據完整性的數據庫引擎中的控件。