2011-12-13 342 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约束,或者当业务规则要求 约束强制执行只有从这一点出发。

但是,当添加约束时,您应该小心,而不检查现有数据,因为这会绕过执行表的数据完整性的数据库引擎中的控件。