工具: 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。
答案 0 :(得分:2)
通常,外键约束的唯一目的是检查主键表中是否存在外键。如果你不想这样做,你为什么要在那里呢?
一种解决方案是在PK为零的主键表中添加Magic Row,然后添加FK约束。这不是纯粹方法的推荐解决方案,但考虑到您在问题中指定的约束,可能是最佳解决方案。
答案 1 :(得分:1)
如果你想创建一个FK而你不想检查existing
数据,你可以使用WITH NOCHECK ...但在这种情况下你只是打败了FK的全部目的。另请注意,查询优化器