2010-05-07 35 views
1

我已经继承了一个并不完全争取数据完整性的数据库。我试图添加一些外键来改变它,但有些表中的数据不符合约束。最有可能的是,数据不会再被使用,所以我想知道我可能面临的问题。我看到的另一个选择是将其移动到某种没有参考约束的表格中,仅用于历史目的。添加外键时不检查现有数据的影响是什么?

那么,不检查现有数据的影响是什么?

如果我在表上创建外键约束并且不检查现有数据,那么将强制插入到表中的所有新数据都被执行?

编辑: 我的确在谈论创建外键时使用WITH NOCHECK选项。

回答

1

正如我所看到的那样,如果你这样做的话,你不会因为坏数据仍然存在于你的数据库中而放弃它 - 如果这些数据不会改变的话,那么你的情况并不会更糟。 它会检查从那个点开始的数据。所以你在确保未来的数据是正确的。

但是,如果坏记录中的任何数据可能会更改,您将遇到问题,因为它将不允许更改,因为FK检查将失败。如果是这种情况,并且您无法清理不良数据,则最好通过将其与基本名为“未知”的父记录相关联来尽可能修复数据。因此,如果父表是客户,并且由于与详细记录相关联的客户在没有检查FK记录的情况下被删除,因此您不再可以知道客户是谁,然后插入客户名称为“未知”的客户记录并更改客户ID到该记录的ID。

+0

太棒了。我希望我至少可以限制未来的数据。我必须看看我可以对旧数据做些什么,只是添加一个“未知”标识符可能对我而言不太合适。 – scottm 2010-05-07 15:37:14

+0

您可以考虑将fk字段中的值清空。 FK可以有空值 – HLGEM 2010-05-07 17:17:05

0

如果外键约束被现有数据触发,则无法创建外键约束。系统会检查你。你应该做的是创建列以在外键中使用,通过填充此列来指向现有记录的每一行(它甚至可以是指示通过遗留数据或转换数据链接的单个“虚拟”记录) ,然后创建FK。

+0

他正在使用WITH NOCHECK进行通话,当存在记录不符合条件时,可以让您创建FK。 – HLGEM 2010-05-07 15:23:19

相关问题