###第五章 数据库完整性
数据库的完整性是指数据的正确性和相容性。
1、提供定义完整性的约束条件的机制
2、提供完整性检查的方法
3、进行违约处理
####5.1实体完整性
5.1.1定义实体完整性
关系模型的实体完整性在CREATE table中用PRIMARY KEY 定义。
对单属性构成的码有两种说明方法,
一种是定义为列级约束条件。
一种是定义为表级约束条件。
【例】CREATE table student (
Sno CHAR(9) PRIMARY key, 注意 /*在列级定义主码*/PRIMARY key是跟在属性后面的
Sname char(20) Not NUll,
Sage CHAR(5),
Sdept CHAR(5)
);
【例】CREATE table student (
Sno CHAR(9),
Sname char(20) Not NUll,
Sage CHAR(5),
Sdept CHAR(5),
PRIMARY KEY(Sno)注意 /*在表级定义主码*/PRIMARY key(Sno)是当作属性设置进去的
);
【例】将SC表中的Sno、Cno属性定义为码
create table SC(
Sno CHAR(9) Not NUll,
Cno char(20) Not NUll,
Grade CHAR(5),
Sdept CHAR(5),
PRIMARY KEY(Sno,Cno)
)
5.1.1实体完整性检查和违约处理
####5.2参照完整性
#####5.2.1定义参照完整性
关系模型的参照完整性在CREATE TABLE中用 FOREIGN KEY 短语定义那些列为外码,用 PEFERENCES 短语指明
这些外码参照那些表的主码。
例如,关系 CS中的一个元组表示一个学生选修的某门课程的成绩,(Sno,Cno)是主码。Sno、Cno分别参照引用
student表中的主码和Course表中的主码
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参照完整性检查和违约处理
参照完整性将两个表中的相应元组联系起来了。因此,对被参照表的参照表进行增、删、改操作时有可能破坏参照完整性,
必须进行检查以保证这两个表的相容性。
当发生不一致时,系统可以采用以下策略加以处理。
(1)拒绝(NO ACTUON)执行
不允许该操作执行,该策略一般设置为默认策略
(2)级联操作
当删除或修改被参照表(Student)的一个元组导致与参照表SC不一致时,删除或修改参照表中的所有导致不一致的元组。
【例】删除Student表中Sno值为“201215121”的元组,则从要SC表中级联删除SC.Sno=’201215121’的所有元组。
(3)设置为空值
当删除或修改被参照表的一个元组导致不一致时,则将参照表中的所有造成不一致的元组的对应属性设置为空值。
注意:这里讲下外码能否接受空值。
在数据库中外码是不能取空值的,因为Sno、和Cno是在其他表中的主键,所以是不能取空值的。
因此对于参照完整性,出了应该定义外码,还应定义外马列是否允许空值。
一般的,当对参照表和被参照表的操作违反了参照完整性是,系统选用默认策略,即拒绝执行。如果想让系统
采用其他策略,必须在创建参照表时显示的加以说明
【例】显示的说明参照完整性的违约处理示例
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) /*在表级定义参照完整性*/
ON DELETE cascADE, /*当删除Student表中的Sno时,级联删除SC表中相应的元组*/
ON UPDATE cascADE, /*当更新Student表中的Sno时,级联更新SC表中相应的元组*/
FOREIGN key(Cno) REFERENCES Course(Cno)
ON DELETE NO ACTUON, /*当删除Course表中的元组造成与SC表不一致时,拒绝删除*/
NO UPDATE CASEADE /*当更新Course表中的Cno时,级联更新SC表中相应的元组*/
);
####5.3用户定义完整性
5.3.1属性上的约束条件
在Create table 中定义属性的同事,可以根据应用要求定义属性上的约束条件即属性值限制,包括:
① 列值非空(not null)
② 列值唯一(UNIQUE)
③ 检查列值是否满足一个条件表达式(CHECk短语)
(1)不允许取空值(NOT NULL)
【例】在定义SC表时,说明Sno和Cno、Grade属性不允许取空值
Create table SC
(Sno char(9) not null,
Cno char(4) not null,
Cno char(4) not null,
Grade SMALLINT,
)
(2)列值唯一(UNIQUE)
建立部门表Dept,要求部门名称Dname列值唯一,部门编号Deptno列为主码
CREATE TABLE DEPT
(Deptno NUMERIC(2),
Dname CHAR(9) UNIQUE NOT null,/*要求列值唯一,且不能取空值*/
loction CHAR(10),
PRIMARY KEY(Deptno)
)
(3)用check短语指定列值应该满足的条件
【例】Student 表的Ssex只允许取“男”,“女”
CREATE table student (
Sno CHAR(9) PRIMARY key,
Sname char(20) Not NUll,
Ssex char(2) check (Ssex IN(‘男”女’)),
Sage CHAR(5),
Sdept CHAR(5)
);
【例】SC的Grade值应该是在0~100之间
CREATE table SC (
Sno CHAR(9) PRIMARY key,
Cno CHAR(9) PRIMARY key,
Grade SMALLINT CHECK(Grade>=0 AND Grade<=100)
);
5.3.2元组上的约束条件
1.元组上约束条件的定义
【例】当学生性别是男,其名字不能以M.s开头
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.%’)
)
####5.4完整性的约束命名子句
1.完整性約束命名子句
CONSTRAINT <完整性约束条件名> <完整性约束条件>
<完整性约束条件包括>包括 not null、UNIQUE、 PRIMARY KEY、FOREIGN KEY、CHECK短语等
【例】建立学生登记表Student 要求学号在90000~999999之间,姓名不能取空值,年龄不能
小于30,性别只能是男女
CREATE table student(
Sno NUMERIC(6) comment
CONSTRAINT C1 check(Sno BETWEEN 90000 AND 99999)
Sname char(6)
CONSTRAINT C2 Not null,
Sage NUMERIC(3)
CONSTRAINT C3 check(Sage<30)
Ssex chear(2)
CONSTRAINT c4 CHECK (Ssex IN(‘男’,’女’)),
CONSTRAINT studentKey PRIMARY key(Sno)
)
本文地址:https://blog.csdn.net/qq_38157534/article/details/108974499