5.4 完整性约束命名子句
- 完整性约束命名子句
constraint <完整性约束条件名><完整性约束条件>
◾ <完整性约束条件>包括not null、unique、primary key短语、foreign key短语、check短语等
[例 5.1] 建立学生登记表Student,要求学号在90000~99999之间,姓名不能取空值,年龄小于30,性别只能是“男”或“女”
create table Student
( Sno numeric(6) constraint c1 check(Sno between 90000 and 99999),
Sname char(20) constraint c2 not null.
Sage numeric(3) constraint c3 check(Sage < 30),
Ssex char(2) constraint c4 check(Ssex in('男','女')),
constraint StudentKey primary key(Sno)
);
[例 5.2] 建立教师表TEACHER,要求每个教师的应发工资不低于3000,元。应发工资是工资列Sal与扣除项Deduct之和。
create table TEACHER
( Eno numeric(4) primary key -- 在列级定义主码
Ename char(10),
Job char(8),
Sal numeric(7,2),
Deptno numeric(2),
constraint TEACHERKey foreign key(Deptno) references DEPT(Deptno),
constraint c1 check (Sal + Deduct >= 3000)
)
- 修改表中完整性限制
◾ 使用alter table语句修改表中的完整性限制
[例 5.3] 去掉**[例 5.1]** Student表中对性别的限制(去掉性别只能是男女限制,我也不知道还能是啥了(¬‿¬))
alter table Student
drop constraint c4;
[例 5.4] 修改Student表中的约束条件,要求学号改为在900000~999999之间,年龄由小于30改为小于40
不能直接修改,只能先删除后修改
◾ 可以先删除原来的约束条件,再增加新的约束条件
alter table Student
drop constraint c1;
alter table Student
add constraint c1 check (Sno between 900000 and 999999);
alter table Student
drop constraint c3;
alter table Student
add constraint c3 check (Sage < 40);
5.6 断言
♥ SQL中,可以使用create assertion语句,通过声明性断言来指定更具一般性的约束
♥ 可以设计多个表或聚集操作的比较复杂的完整性约束
♥ 断言创建后,可以对断言中所涉及的关系的操作都会出发关系数据库管理系统对断言的检查,任何使断言不为真值的操作都会被拒绝执行
- 创建断言的语句格式
◾ create assertion<断言名><check 子句>
◾ 每个断言都被赋予一个名字
◾ <check 子句>中的约束条件与where子句的表达式类似
[例 5.5] 限制数据库课程最多60名学生选修
create assertion ASSE_SC_DB_NUM
check(60 >= (select count(*)
from Course, SC
where SC.Cno = Course.Cno
and Course.Cname = '数据库')
);
触发时机:向SC表中插入元组
违约反应:拒绝执行
[例 5.6] 限制每一门课程最多60名学生选修
create assertion ASSE_SC_CNUM
check(60 >= all(select count(*)
from SC
group by Cno)
);
[例 5.7] 限制每一门课程每个学期最多60名学生选修
首先,需要修改SC表的模式,增加一个“学期(TERM)”属性
alter table SC add TERM DATE;
然后,定义断言:
create assertion ASSE_SC_CNUM2
check(60 >= all(select count(*)
from SC
group by Cno,TERM) -- 需要按照课程号和学期两个条件进行分组
);
如果断言很复杂,则系统检测和维护断言的开销较高,这是在使用断言的时候需要注意的
- 删除断言的语句格式为:
◾ drop assertion <断言名>;
小结:
♥ 完整性约束命名子句
◾ 命名完整性约束
◾ 使用alter table语句修改完整性约束
● 增加/删除/修改完整性约束
♥ 断言
◾ 定义断言
● 用断言定义复杂完整性约束
◾ 删除断言