将sql server约束检查限制为只有新数据
问题描述:
我需要将大量数据导入sql服务器数据库。这些数据中的一些是很久以前导入的,其中大部分数据不能保持参照完整性,但我希望所有新数据都可以使用。我可以在导入之前关闭约束检查,但是如何才能将它们恢复为仅用于稍后将添加的数据?这是可能的还是我必须修复历史数据?将sql server约束检查限制为只有新数据
感谢,
答
放下你的FK约束,添加数据,添加您的FKS回来NOCHECK
答
作为一个丑陋的选择,我想,你可以有两个表 - 一个老坏数据,以及一个新的。仅将DRI约束放在新表上。然后在VIEW中将它们与UNION一起包装,以便其他代码可以将它们作为单个单元一起查询。
答
您可以添加一个约束,将只从那个时候向前确认的数据,但如果你尝试更新该行(如在导入甚至通过用户界面),它会触发约束并失败,除非您修复数据。我强烈建议您在添加约束之前修复数据。无论如何这都是不好的数据,应该修复。 YOu可能需要为父表中的UNKNOWN添加默认记录,前提是您的记录具有子级ID但不包含父级。然后将引用更改为UNKNOWN记录标识。
答
使用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)
坏主意除非进口仅在单用户模式下运行。你正在放弃每个人的约束,而不仅仅是你的过程。这种方式可能会导致更糟糕的数据。 – HLGEM 2010-06-04 15:11:09
完全同意,这些关系是有原因的,他们应该(几乎总是)保持。但是,在一些罕见的情况下,不可能和/或不值得努力返回并使关系发挥作用。想到遗留系统的转换。 -EDIT,我的意思是坚持下你的帖子,而不是你对我的评论。 – 2010-06-04 15:13:35
从遗产转换正是这是什么。但是,他们可能有足够的几个我们可以修复旧数据。如果没有,这会做。谢谢。 – Jeff 2010-06-04 17:46:45