使用 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 列定义了引用关系。
数据库服务器维护这些系统目录表中的现有约束的信息:
当 DROP CONSTRAINT 子句成功删除约束之后,数据库服务器至少删除或更新以上一个或多个表的一行。
缺省情况下,每一 IDSSECURITYLABEL 列拥有一个隐式的 NOT NULL 约束,但是 DROP CONSTRAINT 子句不能引用 IDSSECURITYLABEL 类型的列。
您可以在 ROW 数据类型的已分类表的 ALTER TABLE 操作中包含 DROP 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 关键字避免了重置方式时验证约束的开销。