代码之家  ›  专栏  ›  技术社区  ›  Martin Marconcini

修复旧数据库的外键问题

  •  1
  • Martin Marconcini  · 技术社区  · 15 年前

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

    我遇到了一个有两个表的应用程序。在__code_中,表格如下:

    表1(1__)表2

    所以表1(T1)有一个ID:IDT1,表2(T2)有它的ID(IDT2) A外键t2.idt1

    这个1.n关系是 代码 在某种程度上强制执行。数据库中没有任何FK。(不管是谁设计的,都没有添加约束或类似的东西)。

    问题是,我发现应用程序使用表2中的IDT1(正确地)将引用行存储在表1上, 但是 对于特殊情况也使用零(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指向表1中不存在的行。该软件之所以能工作,是因为它有(很多)地方可以用if语句或类似语句跟踪这个地方。现在改变这一点不是一个好主意(我不想触摸到“有效”的代码,我现在也不写“有效”),除非它是唯一的方法。

    现在我修改了应用程序的其他方面, 需要 要使用FK的数据库(我们用模板重新自动生成代码,如果FK不在那里,则不会生成某些内容)。

    在上述场景中,我是否可以创建一个不检查约束的FK?这会是一个问题吗?(考虑到应用程序已经运行了5年多,在FK中id=0的情况下)?你有什么建议吗?TKS。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Charles Bretana    15 年前

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

    一种解决方案是在主键表中添加一个pk为零的魔力行,然后添加fk约束。这不是纯粹主义方法的推荐解决方案,但是考虑到您在问题中指定的约束条件,这可能是最好的解决方案。

        2
  •  1
  •   SQLMenace    15 年前

    如果要创建FK但不想检查 existing 您可以使用NoCheck的数据……但在这种情况下,您只是破坏了FK的全部目的。还要注意,查询优化器不会考虑使用nocheck定义的约束。