5.3 用户定义的完整性
♥ 用户定义的完整性是:针对某一具体应用的数据必须满足的语义要求
♥ 关系数据库管理系统提供了定义和检验用户定义完整性的机制,不必由应用程序承担
5.3.1 属性上的约束条件
5.3.2 元组上的约束条件
♥ 1.属性上约束条件的定义
♥ create table时定义属性上的约束条件
◾ 列值非空(NOT NULL)
◾ 列值唯一(UNIQUE)
◾ 检查列值是否满足一个条件表达式(CHECK)
♥ (1)不允许取空值
[例 5.1] 在定义SC表时,说明Sno,Cno,Grade属性不允许取空值
create table SC
( Sno char(9) not null,
Cno char(4) not null,
Grade smallint not null,
primary key(Sno, Cno),
...
);
♥ (2)列值唯一
[例 5.2] 建立专业表DEPT,要求专业名城Dname列值取唯一且不能取空值,专业编号Deptno列为主码
create table DEPT
( Deptno NUMERIC(2),
Dname char(9) unique not null, -- 要求Dname列值唯一,并且不能取空值
primary key(Deptno)
);
♥ (3)用check短语指定列值应该满足的条件
[例 5.3] Student表的Ssex只允许取“男”或“女”
create table Student
( Sno char(9) primary key,
Sname char(8) not null,
Ssex char(2) check(Ssex IN ('男', '女')), -- 性别属性Ssex只允许取“男”或“女”
Sage smallint,
Sdept char(20)
);
[例 5.4] SC表的Grade的值应该在0和100之间
create table SC
( Sno char(9),
Cno char(4),
Grade smallint check(Grade >= 0 and Grade <= 100), -- Grade取值范围为0到100
primary key(Sno, Cno),
foreign key(Sno) references Student(Sno),
foreign key(Cno) references Course(Cno)
);
♥ 属性上的约束条件检查和违约处理
◾ 插入元组和修改属性的值时,关系数据库管理系统检查属性上的约束条件是否被满足
◾ 如果不满足则操作被拒绝执行
5.3.1 属性上的约束条件
5.3.2 元组上的约束条件
♥ 属性上的约束条件:只涉及单个属性
♥ 元组级的限制:可以设置不同属性之间的取值的相互约束条件
数据库课程的学分不能低于2学分
♥ 在create table时可以用check子句定义元组上的约束条件
[例 5.5] 当学生的性别是男时,其名字不能以Ms.打头
create table Student
( Sno char(9),
Sname char(8) not null,
Ssex char(2),
Sage smallint,
Sdept char(20),
primary key(Sno),
check(Ssex='女' or Sname not like 'MS.%') -- 定义了元组中Sname和Ssex两个属性之间的约束条件
);
性别是女性的元组都能通过该项检查,因为Ssex='女’成立;
当性别是男性时,要通过检查则名字一定不能以Ms.打头
♥ 元组上的约束条件检查和违约处理
◾ 插入元组或修改属性的值时,关系数据库管理系统检查元组上的约束条件是否被满足
◾ 如果不满足则操作被拒绝执行
小结:
♥ 属性上的用户定义完整性
◾ 定义方法
◾ 检查时机
◾ 违约处理
♥ 元组
上的用户定义完整性
◾ 定义方法
◾ 检查时机
◾ 违约处理