【发布时间】:2010-06-04 15:05:54
【问题描述】:
我需要将大量数据导入 sql server 数据库。其中一些数据是很久以前导入的,其中大部分不保持引用完整性,但我希望所有新数据都可以。我可以在导入之前关闭约束检查,但它如何只为以后添加的数据重新打开它们?这是可能的还是我必须修复历史数据?
谢谢,
【问题讨论】:
标签: sql-server constraints import
我需要将大量数据导入 sql server 数据库。其中一些数据是很久以前导入的,其中大部分不保持引用完整性,但我希望所有新数据都可以。我可以在导入之前关闭约束检查,但它如何只为以后添加的数据重新打开它们?这是可能的还是我必须修复历史数据?
谢谢,
【问题讨论】:
标签: sql-server constraints import
删除您的 FK 约束,添加数据,使用 NOCHECK 添加您的 FK
【讨论】:
使用 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)
【讨论】:
作为一个丑陋的选择,我想你可以有两张表——一张用于旧的坏数据,一张用于新的。仅将 DRI 约束放在新表上。然后将它们与 UNION 一起包装在一个 VIEW 中,以便其他代码可以将它们作为一个单元一起查询。
【讨论】:
您可以添加一个仅从该时间开始检查数据的约束,但如果您尝试更新该行(如在导入中甚至通过用户界面),它将遇到约束并失败,除非您修复数据。我强烈建议您在添加约束之前修复数据。无论如何,这是坏数据,应该修复。如果您的记录具有子 id 但没有父表,则您可能需要在父表中为 UNKNOWN 添加默认记录。然后将引用更改为 UNKNOWN 记录 ID。
【讨论】: