第五章:数据库完整性
5.1 实体完整性
5.1.1 定义实体完整性
关系模型的实体完整性在CREATE TABLE中用PRIMARY KEY定义。对单属性构成的码有两种说明方法,一种是定义为列级约束条件,另一种是定义为表级约束条件。对多个属性构成的码只有一种说明方法,即定义为表级约束条件。
【例5.1】将Student表中的Sno属性定义为码
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY, /*在列级定义主码*/
Sname CHAR(20) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
)
或者
CREATE TABLE Student
(Sno CHAR(9),
Sname CHAR(20) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20),
PRIMARY KEY(Sno) /*在表级定义主码*/
)
【例5.2】将SC表中的Sno、Cno属性组定义为码
CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY(Sno,Cno) /*只能在表级定义主码*/
)
5.2 参照完整性
5.2.1 定义参照完整性
关系模型的参照完整性在CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码,用REFERENCES短语指明这些外码参照哪些表的主码。
例如,关系SC中一个元组表示一个学生的选修的某门课程的成绩,(Sno,Cno)是主码。Sno,Cno分别参照Student表的主码和Course表的主码
【例5.3】定义SC中的参照完整性
CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY(Sno,Cno), /*在表级定义实体完整性*/
FOREIGN KEY(Sno) REFERENCES Student(Sno), /*在表级定义参照完整性*/
FOREIGN KEY(Cno) REFERENCES Course(Cno) /*在表级定义参照完整性*/
)
5.2.2 参照完整性检查和违约处理
【例5.4】显式说明参照完整性的违约处理示例
CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY(Sno,Cno), /*在表级定义实体完整性,Sno、Cno都不为空值*/
FOREIGN KEY(Sno) REFERENCES Student(Sno)/*在表级定义参照完整性*/
ON DELETE CASCADE /*当删除Student表中的元组时,级联删除SC表中对应的元组*/
ON UPDATE CASCADE, /*当更新Student表中的Sno时,级联更新SC表中的相应元组*/
FOREIGN KEY(Cno) REFERENCES Course(Cno)
ON DELETE NO ACTION /*当删除Course表中的元组造成与SC表不一致的时候,拒绝删除*/
ON UPDATE CASCADE /*当更新Course表中的Cno时,级联更新SC表中的相应元组*/
)
5.3 用户定义的完整性
5.3.1 属性上的约束条件
属性上约束条件的定义
在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),