完整性约束命名子句
以上讲解的完整性约束条件都在CREATE TABLE语句中定义,SQL还在CREATE TABLE语句中提供了完整性约束命名子句CONSTRAINT,用来对完整性约束条件命名,从而可以灵活地增加、删除一个完整性约束条件。
①完整性约束命名子句
CONSTRAINT<完整性约束条件名><完整性约束条件>
<完整性约束条件>包括NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECK短语等。
【例1】建立学生登记表Student要求学号在90000~99999 之间,姓名不能取空值,年龄小于30,性别只能是“男”或“女”。

在Student表上建立了5个约束条件,包括主码约束(命名为StudentKey)以及C1、C2、C3、C4这4个列级约束。
【例2】建立教师表TEACHER,要求每个教师的应发工资不低于3000元。应发工资是工资列Sal 与扣除项Deduct之和。

②完整性约束命名子句
可以使用ALTER TABLE语句修改表中的完整性限制。
【例3】去掉例1 Student表中对性别的限制。
ALTER TABLE Student
DROP CONSTRAINT C4;
【例4】修改表Student中的约束条件,要求学号改为在900000~999999之间,年龄由小于30改为小于40。
可以先删除原来的约束条件,再增加新的约束条件。

断 言
在SQL中可以使用数据定义语言中的CREATE ASSERTION语句,通过声明性断言(declarative assertions)来指定更具一般性的约束。可以定义涉及多个表或聚集操作的比较复杂的完整性约束。断言创建以后,任何对断言中所涉及关系的操作都会触发关系数据库管理系统对断言的检查,任何使断言不为真值的操作都会被拒绝执行。
①创建断言的语句格式
CREATE ASSERTION <断言名><CHECK 子句>
每个断言都被赋予一个名字,<CHECK 子句>中的约束条件与WHERE子句的条件表达式类似。
【例5】限制数据库课程最多60名学生选修。

左右滑动或点击查看全图
每当学生选修课程时,将在SC表中插入一条元组(Sno, Cno, NULL),ASSE_SC_DB_NUM断言被触发检查。如果选修数据库课程的人数已经超过60人,CHECK子句返回值为“假”,对SC表的插入操作被拒绝。
【例6】限制每一门课程最多60名学生选修。

【例7】限制每个学期每一门课程最多60名学生选修。首先修改SC表的模式,增加一个“学期(TERM)”的属性。
ALTER TABLE SC ADD TERM DATE;
然后定义断言:

②删除断言的语句格式
DROP ASSERTION<断言名>;
如果断言很复杂,则系统在检测和维护断言上的开销较高,这是在使用断言时应该注意的。


