通过大容量导入操作控制约束检查
更新日期: 2006 年 12 月 12 日
大容量导入数据时,您可以控制大容量导入操作是否强制执行 CHECK 和 FOREIGN KEY 约束。“约束”**是应用于列以定义其有效值的一种业务规则;例如,对包含电话分机号的列而言,其约束的格式可能应为 ####。定义和检查约束是用于确保数据完整性的标准机制。Microsoft 建议通常情况下在增量大容量导入过程中使用约束检查。
有时您可能会希望忽略约束。例如当输入数据包含违反约束的行时。通过忽略约束,可以加载该数据然后使用 Transact-SQL 语句清除该数据。
如果在大容量导入操作之前表为非空状态,则重新验证约束的开销可能超过将 CHECK 和 FOREIGN KEY 约束应用于增量数据的开销。导入有问题的数据后,必须使用 Transact-SQL 清除导入的数据。
重要提示: |
---|
禁用约束时,可能会采用架构修改锁来更新元数据。这会影响其他命令(例如,联机索引生成)或事务。例如,由于在同时执行 DDL 更改,访问目标表的快照隔离事务可能会失败。 |
有关约束的详细信息,请参阅约束。
在大容量导入操作过程中,约束检查行为取决于操作中所使用的命令。默认情况下,bcp 命令和 BULK INSERT 语句会忽略约束。相反,对于 INSERT ...SELECT * FROM OPENROWSET(BULK...) 语句,会默认为检查约束。
下表汇总了大容量导入命令的默认约束检查行为。
命令 | 默认行为 |
---|---|
bcp |
忽略约束 |
BULK INSERT |
忽略约束 |
INSERT ... SELECT * FROM OPENROWSET(BULK...) |
检查约束 |
每个大容量导入命令都提供了限定符,使您可以更改约束的处理方式,如以下各节所述。
使用 bcp 或 BULK INSERT 时检查约束
默认情况下,在由 bcp 命令或 BULK INSERT 语句执行的大容量导入操作过程中,将会忽略约束。
bcp 命令和 BULK INSERT 语句允许您指定在大容量导入操作过程中强制执行约束。强制执行约束会降低大容量导入操作的速度,但可以确保插入的所有数据均不违反任何现有的约束。下表汇总了可以用来指定在大容量导入操作过程中强制执行约束的限定符。
命令 | 限定符 | 限定符类型 |
---|---|---|
bcp |
-h"CHECK_CONSTRAINTS" |
提示 |
BULK INSERT |
CHECK_CONSTRAINTS |
参数 |
有关详细信息,请参阅 bcp 实用工具和BULK INSERT (Transact-SQL)。
忽略 INSERT ...SELECT * FROM OPENROWSET(BULK...) 中的约束
默认情况下,INSERT 检查 CHECK 和 FOREIGN KEY 约束。但是,INSERT ...SELECT * FROM OPENROWSET(BULK...) 语句能够使您覆盖对 CHECK 和 FOREIGN KEY 约束的检查。 .
注意: |
---|
不能禁用 UNIQUE、PRIMARY KEY 或 NOT NULL 约束。 |
下表汇总了用来忽略 CHECK 和 FOREIGN KEY 约束的表提示。
命令 | 限定符 | 限定符类型 |
---|---|---|
INSERT ... SELECT * FROM OPENROWSET(BULK...) |
WITH (IGNORE_CONSTRAINTS) |
表提示 |
下面的示例演示了如何使用此限定符。有关 IGNORE_CONSTRAINTS 提示的详细信息,请参阅表提示 (Transact-SQL)。
验证导入的数据
如果在大容量导入操作过程中忽略约束,则可以向表中插入违反现有约束的数据。因此,表的每个被忽略的约束都将在 sys.check_constraints 或 sys.foreign_keys 目录视图中标记为 is_not_trusted。在某些点,需要检查整个表的约束。
使用用来测试约束条件的 Transact-SQL 查询或存储过程来检查手动导入的数据,可以标识违反约束的导入表行。
请参阅
其他资源
bcp 实用工具
BULK INSERT (Transact-SQL)
DBCC CHECKCONSTRAINTS (Transact-SQL)
INSERT (Transact-SQL)
OPENROWSET (Transact-SQL)
SELECT (Transact-SQL)
表提示 (Transact-SQL)
帮助和信息
更改历史记录
发布日期 | 历史记录 |
---|---|
2006 年 12 月 12 日 |
|