我继承了一个不完全追求数据完整性的数据库。我试图添加一些外键来改变它,但有些表中的数据不符合约束。最有可能的是,数据不会再次使用,因此我想知道将数据放在那里会遇到什么问题。我看到的另一个选择是将其移动到某种表中而没有参考约束,仅用于历史目的。
那么,不检查现有数据有什么影响?
如果我在表上创建外键约束而不检查现有数据,是否会强制插入表中的所有新数据?
修改 我确实在谈论在创建外键时使用WITH NOCHECK选项。
答案 0 :(得分:1)
正如我所看到的,如果你这样做,你就不会因为坏数据仍然在你的数据库中而离开它 - 如果这些数据不会发生变化。 它将检查从该点开始的数据。因此,您要确保未来的数据是正确的。
但是,如果错误记录中的任何数据可能发生变化,您将遇到问题,因为它不会允许更改,因为FK检查将失败。如果是这种情况并且您无法清除不良数据,则最好通过将数据与基本上名为“未知”的父记录相关联来尽可能地修复数据。因此,如果父表是客户,并且您不再能够确定客户是谁,因为与详细记录关联的客户已被删除而未检查FK记录,则插入客户记录,其中客户名称为“未知”并更改客户ID到该记录的ID。
答案 1 :(得分:0)
如果现有数据违反外键约束,则无法创建外键约束。系统会检查你。你应该做的是创建要在外键中使用的列,通过填充此列来指向现有记录的每一行(它甚至可以是您指示由遗留数据或转换数据链接的单个“虚拟”记录) ,然后创建FK。