1.5.3 如何在创建表之后指定约束
约束既可以在创建表的同时定义,也可以在表创建之后再添加。不过在表创建之后再添加约束可能会带来这样的问题,如果表中已经有数据,而这样的数据不满足将要添加的约束,那么约束是无法添加的。例如要为表的某个列指定NOT NULL约束,但是这个表中这个列本来就有很多空值,这种情况导致这个约束无法添加。因此最好的做法是在创建表之前充分考虑需要什么样的约束,在创建表的同时定义约束。
添加约束实际上也是对表结构的修改,因此添加约束也是通过执行ALTER语句完成的。因为表的结构已经确定,所以我们无法采用列级约束的形式,在某个列名之后指定约束,而只能采用表级约束的形式。添加约束的ALTER语句格式为:
ALTER TABLE表名ADD(CONSTRAINT约束名约束类型(列名))
其中CONSTRAINT关键字和约束名是可省的,如果没有为约束指定名称,那么名称将自动产生。如果要添加多个约束,在ADD子句的括号中指定多个用逗号分隔的约束就可以了。现在假设表student上没有任何约束,我们为这个表添加几个约束,具体的语句为:
SQL>ALTER TABLE student
ADD(CONSTRAINT pk_sno PRIMARY KEY(sno),
CONSTRAINT gen_check CHECK(gender in('男','女')));
除NOT NULL约束以外,其余四种约束都可以通过ADD子句添加。NOT NULL约束约束比较特殊,只能通过ALTER命令的MODIFY子句来添加。添加NOT NULL约束的语法格式为:
ALTER TABLE表名MODIFY(列名CONSTRAINT约束名NOT NULL);
同样,如果要为多个列施加NOT NULL约束,那么在MODIFY子句之后的括号中指定多个约束项,相互之间用逗号分隔开即可。假设表student中的sname列上没有NOT NULL约束,可以通过下面的ALTER语句在该列上增加NOT NULL约束:
SQL>ALTER TABLE student MODIFY(sname CONSTRAINT nn_sname NOT NULL);