SET CONSTRAINTS 语句

使用 SET CONSTRAINTS 语句来更改处理表上的某些或所有现有的约束的方式。

语法

仅 SQL 的 CREATE TABLE、CREATE TEMP TABLE 和 ALTER TABLE ADD CONSTRAINT 语句可创建新的约束。SET CONSTRAINTS 语句支持下列语法,用于修改数据库服务器强制(或不理会)单个表上的一个或多个现有的约束的方式:

约束模式
元素 描述 限制 语法
constraint 要重置其模式的约束 必须存在,且必须都在同一表上定义 标识符
owner table 的所有者 必须拥有表 所有者名称
table 对于所有约束,要重置其约束模式的表 必须在数据库中存在 标识符

用法

SET CONSTRAINTS 语句的 Constraint-mode 关键字选项包括这些:
  • 是在语句级(IMMEDIATE)还是在事务级(DEFERRED)检查约束
  • 是启用(ENABLED)还是禁用(DISABLED)约束
  • 带有违反表的表上的约束的过滤模式应为 FILTERING WITH ERROR 还是 FILTERING WITHOUT ERROR
  • 是否要启用引用约束,而不验证(NOVALIDATE)每行中的外键值是否与被引用的表中的主键值相匹配。

SET Transaction Mode 语句可以 SET CONSTRAINTS 关键字开始,在 SET Transaction Mode 语句 中对此描述。

SET Database Object Mode 语句的特殊情况也可以 SET CONSTRAINTS 关键字开始,这是对 SQL 的 ANSI/ISO 标准的扩展。除了约束之外,SET Database Object Mode 语句还可启用或禁用触发器或索引,或更改唯一索引的过滤模式。要获取那个语句的完整语法和语义,请参阅 SET Database Object Mode 语句

要获取关于使用 SET CONSTRAINTS 语句来启用或禁用通过 PRIMARY KEY 和 FOREIGN KEY 约束定义隐式地创建的系统定义的索引的信息,请参阅主题 SET INDEXES 语句

约束模式的保持

您对约束的模式的任何更改都保持,直到再次修改那个约束模式的设置,或直到删除那个约束或它的表为止。

然而,引用约束的 NOVALIDATE 模式是例外,因为这些模式在指定 NOVALIDATE 模式的 SET CONSTRAINTS 语句之外(或 ALTER TABLE ADD CONSTRAINT 语句之外)不保持。

也就是说,当指定 NOVALIDATE 模式的 DDL 语句完成时,该约束模式转化为 sysobjstate 系统目录表为这三种可能的模式之中的外键约束记录的任何一种模式:
  • ENABLED NOVALIDATE 成为 ENABLED
  • FILTERING WITH ERROR NOVALIDATE 成为 FILTERING WITH ERROR
  • FILTERING WITHOUT ERROR NOVALIDATE 成为 FILTERING WITHOUT ERROR.
在所有对该表的后续 DML 操作中,诸如 SQL 的 DELETE、INSERT、MERGE 或 UPDATE 语句,数据库服务器在通过它的 IMMEDIATEDEFERRED 设置确定的时间点,强制启用的外键约束,但不理会任何先前的 NOVALIDATE 模式。

在辅助服务器上的约束

在集群环境中,在可更新的辅助服务器上,不支持 SET CONSTRAINTS ENABLED 和 SET CONSTRAINTS DISABLED 语句。(更一般地,SET Database Object Mode 语句指定的会话级索引、触发器和约束模式不会为辅助服务器的数据库中表对象上的 UPDATE 操作被重定向。)

1 GBase 8s 扩展。约束必须在当前数据库中的表上。
2 See 过滤模式
3 仅对 FOREIGN KEY 约束有效