【数据库系统概论】用户定义的完整性
用户定义的完整性是:针对某一具体应用的数据必须满足的语义要求
关系数据库管理系统提供了定义和检验用户定义完整性的机制,不必由应用程序承担
属性上的约束条件
CREATE TABLE时定义属性上的约束条件
列值非空(NOT NULL)
列值唯一(UNIQUE)
检查列值是否满足一个条件表达式(CHECK)
(1)不允许取空值
[例5.5] 在定义SC表时,说明Sno、Cno、Grade属性不允许取空值。
关系数据库管理系统提供了定义和检验用户定义完整性的机制,不必由应用程序承担
属性上的约束条件
CREATE TABLE时定义属性上的约束条件
列值非空(NOT NULL)
列值唯一(UNIQUE)
检查列值是否满足一个条件表达式(CHECK)
(1)不允许取空值
[例5.5] 在定义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), … /* 如果在表级定义实体完整性,隐含了Sno,Cno不允许取空值,则在 列级不允许取空值的定义 可以不写 * / );
(2)列值唯一
[例5.6]建立部门表DEPT,要求部门名称Dname列取值唯一,部门编号Deptno列为主码
CREATE TABLE DEPT ( Deptno NUMERIC(2), Dname CHAR(9) UNIQUE NOT NULL, /*要求Dname列值唯一, 并且不能取空值*/ Location CHAR(10), PRIMARY KEY (Deptno) );
(3)用CHECK短语指定列值应该满足的条件
[例5.7] 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.8] 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) );
属性上的约束条件检查和违约处理
插入元组或修改属性的值时,关系数据库管理系统检查属性上的约束条件是否被满足
如果不满足则操作被拒绝执行
元组上的约束条件
在CREATE TABLE时可以用CHECK短语定义元组上的约束条件,即元组级的限制
同属性值限制相比,元组级的限制可以设置不同属性之间的取值的相互约束条件
[例5.9]当学生的性别是男时,其名字不能以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.打头
元组上的约束条件检查和违约处理
插入元组或修改属性的值时,关系数据库管理系统检查元组上的约束条件是否被满足
如果不满足则操作被拒绝执行
编程是个人爱好