1.5.4 约束的维护

如果希望去掉表上的某个约束,可以将其删除,也可以使其无效。约束是不能被修改的,如果在表上已经建立了一个约束,现在希望把它改为另一类型的约束,或者希望把它施加在另一个列上,只能先将这个约束删除,然后重新创建。

删除约束是通过执行ALTER命令的DROP子句来完成的。删除约束的ALTER命令的语法格式为:


ALTER TABLE表名DROP CONSTRAINT约束名;


例如,要删除表student上的约束gen_check,可以执行下面的ALTER命令:


ALTER TABLE student DROP CONSTRAINT gen_check;


如果要删除一个主键约束,首先要考虑这个主键列是否已经被另一个表的外键列关联,如果没有关联,那么这个主键约束可以被直接删除,否则不能直接删除。例如,在表dept中,在列deptno上定义了主键,在表emp中的deptno上定义外键约束,两个表之间通过主键和外间建立了关联,那么主键约束是不能被直接删除的。要删除主键约束,必须使用CASCADE关键字,连同与之关联的外键约束一起删除。删除主键的ALTER命令语法格式为:


ALTER TABLE表名DROP CONSTRAINT主键约束名CASCADE;


例如,要删除表dept上的主键约束pk_dept,可以执行下面的ALTER语句:


SQL>ALTER TABLE dept DROP CONSTRAINT pk_dept CASCADE;


约束被删除后,加在表上的限制条件被取消,在此之后写入的数据或修改的数据再也不用考虑这些限制条件。例如,将表student上的约束gen_check删除后,员工的性别可以是‘男’和‘女’以外的其他数据。

在表中建立主键约束或UNIQUE约束时,在相关的列上将自动建立唯一性索引。当从表中删除主键约束或UNIQUE约束时,与它们相关的索引也被一起删除。

如果一个表被删除了,那么依附于它的约束也就没有意义了,这个表上的约束也将被一起删除。

如果希望一个约束暂时不起作用,可以使其无效。使约束无效的操作是通过ALTER命令的DISABLE子句实现的。使约束无效的ALTER命令格式为:


ALTER TABLE表名DISABLE CONSTRAINT约束名;


例如,要使表student上的约束nn_sname无效,相应的语句为:


SQL>ALTER TABLE student DISABLE CONSTRAINT nn_sname;


一个约束无效后,它的状态就变为DISABLED,这时通过查询数据字典,可以了解约束的当前状态。例如,下面的SELECT语句查询表STUDENT上的约束及其状态:


SQL>SELECT constraint_name AS约束名,constraint_type AS约束类型,status AS状态

FROM user_constraints

WHERE table_name='STUDENT';


这条SELECT语句的执行结果为:


约束名 约束类型 状态

NN_SNAME C DISABLED

GEN_CHECK C ENABLED

PK_SNO P ENABLED


当一个约束无效后,这个约束并没有从数据库中被删除,只是暂时不起作用。这时要向表中插入数据或修改已有数据时,就不必满足这个约束条件了。如果希望一个约束重新有效,可以执行带ENABLE子句的ALTER命令。这时ALTER命令的格式为:


ALTER TABLE表名ENABLE CONSTRAINT约束名;


例如,要使刚才已经无效的约束nn_sname重新有效,可以执行下面的ALTER语句:


ALTER TABLE student ENABLE CONSTRAINT nn_sname;


约束重新有效后,它在数据字典中的状态就变为ENABLED。需要注意的是,在一个约束无效到重新有效的这段时间内,用户可能向表中插入了一些数据,或者修改了一些数据,这些数据可能恰好不满足这个约束条件,这样在执行上面的ALTER语句时就会出错,约束将无法重新有效,出错信息类似于这样:“无法验证(SCOTT.NN_SNAME)-违反检查约束条件”。