【问题标题】:limiting sql server constraint checks to only new data将 sql server 约束检查限制为仅新数据
【发布时间】:2010-06-04 15:05:54
【问题描述】:

我需要将大量数据导入 sql server 数据库。其中一些数据是很久以前导入的,其中大部分不保持引用完整性,但我希望所有新数据都可以。我可以在导入之前关闭约束检查,但它如何只为以后添加的数据重新打开它们?这是可能的还是我必须修复历史数据?

谢谢,

【问题讨论】:

    标签: sql-server constraints import


    【解决方案1】:

    删除您的 FK 约束,添加数据,使用 NOCHECK 添加您的 FK

    【讨论】:

    • 坏主意,除非导入仅在单用户模式下运行。您正在放弃对每个人的限制,而不仅仅是您的流程。这样你可能会得到更糟糕的数据。
    • 完全同意,关系的存在是有原因的,应该(几乎总是)保持。然而,有一些罕见的情况是不可能和/或不值得努力回去使关系正常工作。我想到了遗留系统的转换。 -编辑,我的意思是把这个贴在你的帖子下面,而不是你对我的评论。
    • 从 legacy 的转换正是如此。但是,它们可能很少,我们只能修复旧数据。如果没有,这会做。谢谢。
    【解决方案2】:

    使用 NOCHECK

    例子

    CREATE TABLE CheckTbl (col1 int, col2 int);
    GO
    
    
    insert CheckTbl values(1,1)
    insert CheckTbl values(2,1)
    
    ALTER TABLE CheckTbl  WITH NOCHECK 
    ADD CONSTRAINT chkRowCount CHECK (col1 > 1) ;
    GO
    
    -- will fail now
    insert CheckTbl values(1,1)
    

    【讨论】:

      【解决方案3】:

      作为一个丑陋的选择,我想你可以有两张表——一张用于旧的坏数据,一张用于新的。仅将 DRI 约束放在新表上。然后将它们与 UNION 一起包装在一个 VIEW 中,以便其他代码可以将它们作为一个单元一起查询。

      【讨论】:

        【解决方案4】:

        您可以添加一个仅从该时间开始检查数据的约束,但如果您尝试更新该行(如在导入中甚至通过用户界面),它将遇到约束并失败,除非您修复数据。我强烈建议您在添加约束之前修复数据。无论如何,这是坏数据,应该修复。如果您的记录具有子 id 但没有父表,则您可能需要在父表中为 UNKNOWN 添加默认记录。然后将引用更改为 UNKNOWN 记录 ID。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-24
          • 2015-08-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多