如果您没有声明约束的名称,则数据库服务器为此新约束生成一个标识符,它注册在
sysconstraints 和 sysobjstate 系统目录表中。
ALTER TABLE ADD CONSTRAINT 语句支持引用约束的 NOVALIDATE 方式作为创建或过
滤引用约束时绕过数据完整性检查的机制。
NOVALIDATE 方式可以提高性能的情况
尽管引用约束保护数据完整性,在某些情况下您正要移动到新数据库服务器实例的数据库
表是已知的自由参照完整性违规。对于大表上的外键约束,验证约束所需的时间要十分充
分。如果有数百万行的表正从 OLTP 环境移动至数据仓库环境,则验证目标环境中的外键
可能增加数量级迁移所需的时间。
例如,您可以删除大表上的外键约束,然后在该表迁移到目标表环境之前,立即重新创建
ENABLED NOVALIDATE 方式或 FILTERING NOVALIDATE 方式的约束。重建外键约束
的 ALTER TABLE ADD CONSTRAINT 操作的花销几乎很小,因为它绕过了对每一行引用
约束的验证。因为 NOVALIDATE 方式不会持续超过创建该约束的 ALTER TABLE 操作,
抵达数据仓库环境中的表带有 ENABLED 或 FILTERING 方式的约束,保护了随后 DML
操作中数据的参照完整性。
使用 NOVALIDATE 关键字的限制
创建外键约束时, NOVALIDATE 关键字仅在 ALTER TABLE ADD CONSTRAINT 语句的
DDL 上下文中有效。 例如,您不能在以下任何 SQL 语句中创建处于 NOVALIDATE 方式
的外键约束:
CREATE TABLE 语句
CREATE TEMP TABLE 语句
SELECT INTO TABLE 语句
如果满足下列条件,则您可以使用 ALTER TABLE ADD CONSTRAINT 语句在现有表上创
建处于 NOVALIDATE 方式的启用约束:
您正在添加的约束是外键约束。如果您在同一 ALTER TABLE 语句中创建多个约
束,那么所有的约束必须都是外键约束。
在 ALTER TABLE 语句中,NOVALIDATE 关键字只在 ADD CONSTRAINT
FOREIGN KEY 选项中有效。
ALTER TABLE 在 DISABLED 方式下创建的约束是无效的。
如果在以下约束定义的语法上下文中包含 NOVALIDATE 关键字,则 ALTER TABLE 语句
发生错误而失败:
ALTER TABLE ADD COLUMN 语句
ALTER TABLE INIT 语句
ALTER TABLE MODIFY 语句
评论