在 NOVALIDATE 方式下创建外键约束

ALTER TABLE ADD CONSTRAINT 语句可以创建或过滤 NOVALIDATE 方式的外键约束。
NOVALIDATE 约束方式防止数据库服务器在创建引用约束时,验证每一行的外键值是否符合被引
用表中的主键值。
使用此语法创建启用或过滤 NOVALIDATE 方式的外键约束:
ALTER TABLE ADD CONSTRAINT
用法
该语法忽略 DISABLED 关键字。因为禁用的约束不会进行违例检查,在这种情况下,
NOVALIDATE 关键字不重要。
如果没有列或列表立即跟随在 REFERENCES 关键字之后,则缺省列(或列组)是 pk_tab 表的主
键。如果 pk_tab 和 table 或 synonym 指定同一表,则约束自我引用,并没有缺省的主键列。
如果您没有声明约束的名称,则数据库服务器为此新约束生成一个标识符,它注册在
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 语句
使 NOVALIDATE 关键字有效的其它 DDL 语句只有 SET Database Object Mode 语句的 SET
CONSTRAINTS 选项。当运行 SET CONSTRAINTS 语句时,它可以将现有外键约束的方式更改为
这些 NOVALIDATE 约束方式:
⚫ ENABLED NOVALIDATE 方式
⚫ FILTERING WITH ERROR NOVALIDATE 方式
⚫ FILTERING WITHOUT ERROR NOVALIDATE 方式.
有关更多信息,请参阅 SET CONSTRAINTS 语句。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值