DROP CONSTRAINT 子句

使用 DROP CONSTRAINT 子句删除指定的约束。

ALTER TABLE 语句的 DROP CONSTRAINT 子句具有此语法:
DROP CONSTRAINT 子句
元素 描述 限制 语法
constraint 要删除的约束 在数据库中必须存在 标识符

用法

要删除现有约束,请指定 DROP CONSTRAINT 关键字和此约束的名称。要删除同一表上的多个约束,则约束名称列表必须逗号分隔并由括号分隔。

您要删除的约束可具有 ENABLED 、DISABLED 或 FILTERING 方式。

这里是一个删除约束的示例:

ALTER TABLE manufact DROP CONSTRAINT con_name; 

以下示例删除了定义在 orders 表中的引用约束和检查约束:

ALTER TABLE orders DROP CONSTRAINT (con_ref, con_check); 

GBase 8s SQL 执行包含非 DROP CONSTRAINT 语句。然而,如果该语句存在,则ALTER TABLE 语句的此子句提供一个 DROP CONSTRAINT 语句除外的功能。

当 DROP TABLE 语句删除该表时,会默示地删除该指定表上所有的约束。

获取约束名称

DROP CONSTRAINT 子句需要约束的名称。如果创建约束时没有声明名称,则数据库服务器生成新的约束的名称。您可以查询 sysconstraints 系统目录表以获得约束的名称的所有者。例如,要查找位于 items 表上约束的名称,您可以发出以下语句:

SELECT constrname FROM  sysconstraints
        WHERE tabid = (SELECT tabid FROM systables
        WHERE tabname = 'items'); 

约束之间的依赖

当您删除拥有对应外键的主键约束或唯一约束时,任何相关联的引用约束也会被删除。

例如,在 stores_demo 数据库中,orders 表的 order_num 列上具有主键约束。对应的外键约束也定义在 items 表中的 order_num 列。这些约束定义在这两个表中的 order_num 列定义了引用关系。

假设您运行 ALTER TABLE orders DROP CONSTRAINT 语句删除 orders order_num 列上的主键约束。因为在这两个表之间的参照完整性关系不能没有主键约束,如果此示例中的 ALTER TABLE 语句成功,则数据库服务器将会采取这些操作:
  • 删除 orders order_num 列上指定的主键约束。
  • 删除 items order_num 列上对应的引用约束。
  • 从系统目录中删除所有引用 orders 表的主键或 items 表上引用约束。

删除约束对系统目录的影响

数据库服务器维护这些系统目录表中的现有约束的信息:

当 DROP CONSTRAINT 子句成功删除约束之后,数据库服务器至少删除或更新以上一个或多个表的一行。

数据类型的注意事项

缺省情况下,每一 IDSSECURITYLABEL 列拥有一个隐式的 NOT NULL 约束,但是 DROP CONSTRAINT 子句不能引用 IDSSECURITYLABEL 类型的列。

您可以在 ROW 数据类型的已分类表的 ALTER TABLE 操作中包含 DROP CONSTRAINT 子句。

还原引用约束

对于某些操作,例如将表重新定位到另一个数据库中,您可能要求引用约束暂时不会对它的表产生影响。然而,当您不带此约束而完成操作后,数据库的参照完整性通常要求还原此约束的功能。可能的选项是:
  • 使用 DROP CONSTRAINT 子句删除此约束。
  • 完成此任务需要避免该约束的影响。
  • 使用 ALTER TABLE ADD CONSTRAINT 重建此约束。

对于符合已删除外键约束的大表,在 ALTER TABLE ADD CONSTRAINT 已经中使用 NOVALIDATE 选项可以避免创建约束时使用全表扫描验证约束的显著成本。此 NOVALIDATE 选项要求使 Multi-Column Constraint Format 语法定义此约束。

类似地,比起删除大表上的引用约束,您可以禁用它,然后完成任务,使用禁用的约束需要较少的资源。要恢复约束的强制性,您可以使用 SET Database Object Mode 语句的 SET CONSTRAINTS 选项将此对象的方式重置为 ENABLED NOVALIDATE 或 FILTERING WITH ERROR NOVALIDATE 或 FILTERING WITHOUT ERROR NOVALIDATE。在以上每一种约束方式中,NOVALIDATE 关键字避免了重置方式时验证约束的开销。