修复旧数据库的外键问题

时间:2010-02-08 15:18:08

标签: .net sql-server foreign-keys

工具: SQL2000 / 5/8,.NET 3.5,C#

我遇到过一个有两个表的应用程序。在“代码”中,表格如下所示:

表1(1-N)表2

因此Table1(T1)具有Id:IdT1和Table2(T2)具有其id(IdT2)外键t2.IdT1

此1.N关系在某种程度上强制执行代码。数据库中没有任何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语句或类似方法“跟踪”它的地方。现在更改它并不是一个好主意(我不想触及“工作而我现在没有写”的代码),除非这是唯一的方法。

现在我正在修改应用程序的其他方面,我需要数据库才能拥有FK(我们使用模板自动生成代码,如果FK不在那里,某些事情就赢了'生成)。

鉴于上述情况,我有没有办法创建一个不会“永远”检查约束的FK?这是一个“问题”(考虑到应用程序已经工作超过5年,在FK中这个Id = 0的事情)?你有什么建议吗? TKS。

2 个答案:

答案 0 :(得分:2)

通常,外键约束的唯一目的是检查主键表中是否存在外键。如果你不想这样做,你为什么要在那里呢?

一种解决方案是在PK为零的主键表中添加Magic Row,然后添加FK约束。这不是纯粹方法的推荐解决方案,但考虑到您在问题中指定的约束,可能是最佳解决方案。

答案 1 :(得分:1)

如果你想创建一个FK而你不想检查existing数据,你可以使用WITH NOCHECK ...但在这种情况下你只是打败了FK的全部目的。另请注意,查询优化器

不会考虑使用NOCHECK定义的约束