思维导图:
5.3 用户定义的完整性
用户定义的完整性是确保数据库中的数据满足特定应用的语义要求。这是通过关系数据库管理系统(RDBMS)中的内置机制来完成的,不需要依赖应用程序来执行。
5.3.1 属性上的约束条件
1. 定义属性上的约束条件
当在CREATE TABLE
中定义属性时,可以为属性定义一系列的约束条件。主要有以下几种类型的约束:
-
列值非空(
NOT NULL
): 确保列中的数据不为空。 -
列值唯一(
UNIQUE
): 确保列中的数据是唯一的。 -
使用
CHECK
短语检查列值是否满足特定条件。示例:
-
CREATE TABLE SC (Sno CHAR(9) NOT NULL,Cno CHAR(4) NOT NULL,Grade SMALLINT NOT NULL,PRIMARY KEY (Sno, Cno) );
-
CREATE TABLE DEPT (Deptno NUMERIC(2),Dname CHAR(9) UNIQUE NOT NULL,Location CHAR(10),PRIMARY KEY(Deptno) );
-
CREATE TABLE Student (Sno CHAR(9) PRIMARY KEY,Sname CHAR(8) NOT NULL,Ssex CHAR(2) CHECK (Ssex IN ('男', '女')),Sage SMALLINT,Sdept CHAR(20) );
-
CREATE TABLE SC (Sno CHAR(9),Cno CHAR(4),Grade SMALLINT CHECK (Grade >= 0 AND Grade <= 100),PRIMARY KEY (Sno, Cno),FOREIGN KEY (Sno) REFERENCES Student(Sno),FOREIGN KEY (Cno) REFERENCES Course(Cno) );
-
2. 检查属性约束和处理违规情况
当尝试向表中插入新数据或修改现有数据时,RDBMS会检查这些数据是否满足约束条件。如果数据违反了任何约束,那么操作将不会被允许。
总结:用户定义的完整性确保了数据在特定应用中的正确性。通过使用数据库的内建约束机制,我们可以确保数据的完整性和准确性。
5.3.2 元组上的约束条件
与对单一属性上设置约束条件的方法类似,我们还可以在整个元组(即数据行)上设置约束条件。这种约束是为了确保在一个元组中的多个属性值之间有某种关系或满足某些特定的条件。
1. 定义元组上的约束条件
使用CREATE TABLE
语句的CHECK
短语,我们可以为表中的整个元组设置约束。这种约束允许我们在多个属性之间设置相互的约束条件。
示例:
-
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.%') /* 这个CHECK约束确保了当性别是男时,名字不以'Ms.'开头 */ );
对于这个示例,元组的约束条件的工作原理如下:对于女性学生,Ssex = '女' 为真,因此元组将被接受,不论其名字是什么。对于男性学生,如果他们的名字以“Ms.”开头,那么这个约束将为假,因此不会被接受。
2. 检查和处理元组约束的违规
与属性上的约束条件相同,当向表中插入新的元组或更改现有的元组时,RDBMS将检查这些元组是否满足定义的元组级约束。如果元组违反了约束条件,操作将被拒绝。
总结:元组上的约束条件为我们提供了一个强大的工具,以确保在表中的多个属性之间保持一致性和逻辑关系。通过正确使用这些约束,我们可以进一步增强数据库中数据的完整性和准确性。
用户定义的完整性总结:
重点:
-
定义与理解:用户定义的完整性是确保数据在特定应用中满足预期的语义要求。它可以在属性级别或元组级别定义。
-
实现方式:大多数关系数据库管理系统提供了内置机制来定义和验证这种完整性,使得数据在输入、更新或删除时满足特定的条件或关系。
-
属性上的约束:包括非空(NOT NULL)、唯一性(UNIQUE)和满足某条件(使用CHECK短语)。
-
元组上的约束:使用
CHECK
短语定义,主要用于确保元组内的多个属性之间存在某种关系。
难点:
-
复杂的逻辑关系:元组级的约束可能涉及多个属性间复杂的逻辑关系,需要深入理解业务逻辑来正确定义。
-
性能考虑:过多或过于复杂的完整性约束可能会影响数据库操作的性能,特别是在大型数据集上。
-
与其他完整性的交互:用户定义的完整性可能与实体完整性、参照完整性等其他类型的完整性有所交互或冲突,需要仔细规划和设计。
易错点:
-
不完全或不正确的约束定义:可能由于对业务规则的误解或遗漏,导致定义的约束不完全或不正确。
-
过于严格的约束:设置过于严格的约束可能会妨碍某些合理的数据库操作,导致不必要的操作拒绝。
-
约束的命名与管理:在大型数据库中,约束的命名和管理可能变得混乱,增加维护难度。
-
未考虑的异常情况:在某些未考虑到的特殊情况下,用户定义的约束可能会导致数据完整性问题。