文章目录
数据库的完整性
防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据;
防范对象:不合语义的、不正确的数据
- 为了维护数据库的完整性,DBMS必须:
1、 提供完整性约束条件的机制;
2、提供完整性检查的方法;
3、违约处理;
一、实体完整性
1、定义实体完整性
关系模型的实体完整性
CREATE TABLE 时用 PRIMARY KEY定义
单属性构成的码有两种定义方法:
- 定义为列级约束条件 即在属性的后边定义
举个例子:将Student表中的Sno属性定义为码
CREATE TABLE Student( Sno CHAR(9) PRIMARY KEY Sname CHAR(4) , Ssex CHAR(2) , Sage SMALLINT , Sdept CHAR(2) );
- 定义为表级约束条件 即在最后声明谁是码
举个例子:将Student表中的Sno属性定义为码
CREATE TABLE Student( Sno CHAR(9), Sname CHAR(4) , Ssex CHAR(2) , Sage SMALLINT , Sdept CHAR(2), PRIMATY KEY(Sno) //定义为表级完整性约束条件 );
多属性构成的码只有一种定义方式:
定义为表级约束条件
举个例子:将SC表中的 sno和cno定义为码
CREATE TABLE SC( Sno CHAR(9) , Cno SMALLINT , Grade SMALLINT , PRIMARY KEY(sno,cno) //定义表级完整性 );```
2、 实体完整性检查和违约处理
插入或对主码列进行更新操作时,DBMS按照实体完整性自动进行检查,包括:
1、 检查主码值是否唯一,如果不唯一,那么就拒绝插入或者修改;
2、 检查主码的各个属性是否为空,如果为空,那么就拒绝插入或者修改;
检查主码是否唯一的操作 包括 全表扫描和索引两种方法;
二、参照完整性
实体完整性是对单张表格而言,对主属性进行完整性定义,而参照完整性就是相较于两张表而言的
1、定义参照完整性
CREATE TABLE 时用FOREIGN KEY定义哪些列为外码,用PEFERENCES指明这些外码参照哪些表的主码;
讲到这里有提到外码的定义 外码就是相对于该表而言,不是该表格码,但却是其他表的码;
举个例子: 定义SC表格中的参照完整性
CREATE TABLE SC( Sno CHAR(9) , Cno SMALLINT , Grade SMALLINT , PRIMARY KEY(sno,cno), FOREIGN KEY (Sno) REFERENCES Student(Sno), FOREIGN KEY (Cno) REFERENCES Course(Cno) );
2、参照完整性检查和违约条件
参照完整性,顾名思义就是“参照”,也就是说参照表(sc)表中的sno是参照被参照表(student表)的sno,所以sc表中的sno一定是在被参照表(student表)中存在的;
当你想插入或者修改一条选课记录时,sno必须是存在的;
举个例子:当你想要插入一个学号没在student表中存在的选课记录时
INSERT INTO sc VALUES('200215126',3,80)
结果:
对于被参照表而言,当你要删除被参照表的元组或者修改主码值时,也会破坏参照完整性;
处理方式:
1.拒绝执行 (NO ACTION)–默认策略
CREATE TABLE SC( Sno CHAR(9) , Cno SMALLINT , Grade SMALLINT , PRIMARY KEY(sno,cno), FOREIGN KEY (Sno) REFERENCES Student(Sno), //默认就是 NO ACTION FOREIGN KEY (Cno) REFERENCES Course(Cno) );
DELETE FROM student WHERE SNO='200215121';
结果:
UPDATE student SET sno='200215126'WHERE Sno='200215121';
结果:
2、级联操作( ON DELETE CASCADE ON UPDATE CASCADE)
CREATE TABLE SC( Sno CHAR(9) , Cno SMALLINT , Grade SMALLINT , PRIMARY KEY(sno,cno), FOREIGN KEY (Sno) REFERENCES Student(Sno) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (Cno) REFERENCES Course(Cno) );
修改被参照表 student 的码值 或者删除元组后,sc表会有一个级联操作,sc表相应的数据也会被删除;
3、设为空值 (SET NULL)
将被参照表(student)的值被删除后,参照表(sc)对应值被设为空值;
将被参照表(student)的值更新后,参照表(sc)对应值被设为空值;
总结:
三、 属性上的约束条件
1、属性上的约束条件的定义
CREATE TABLE 时定义:
- NOT NULL —列表值非空
- UNIQUE —列表值唯一
- CHECK — 检查列值是否满足一个表达式
2、属性上的约束条件的检查和违约处理
插入元组或者修改属性时,DBMS自动检查属性上的约束条件时候满足要求,如果不满足,操作就拒绝执行;
- 列不允取空值
举个例子: 学生表的名字,性别,年龄,系别 不能取空值
CREATE TABLE Student(
Sno CHAR(9),
Sname CHAR(4) NOT NULL,
Ssex CHAR(2) NOT NULL,
Sage SMALLINT NOT NULL,
Sdept CHAR(2) NOT NULL,
PRIMATY KEY(Sno) //定义为表级完整性约束条件
);
- 列取唯一值
举个例子: 课程表的课程名称必须取唯一值;
CREATE TABLE Course(
Cno SMALLINT PRIMARY KEY ,
Cname VARCHAR(10) UNIQUE, //取唯一值
Cpno SMALLINT,
Ccredit SMALLINT '
)COMMENT'课程表';
- 用CHECK短语指定列值应该满足的条件;
举个例子: 学生表的性别只能取男或女;
CREATE TABLE Student(
Sno CHAR(9) PRIMARY KEY
Sname CHAR(4) ,
Ssex CHAR(2) CHECK(Ssex IN('男','女')) ,
Sage SMALLINT ,
Sdept CHAR(2)
);
四、完整性约束条件命名子句
1、完整性命名子句定义
CREATE TABLE 时可以对完整性约束条件进行命名,从而灵活的增加,删除一个完整性约束条件
CONSTRAINT<完整性约束条件名><完整性约束条件>
完整性约束条件包括:
- NOT NULL
- UNIQUE
- CHECK
- PRIMARY KEY
- FOREIGN KEY
2、修改表中的完整性限制
举个例子: 将student表中的学号的范围改为111111111-999999999之间,将年龄有小于30岁改为小于40岁
ALTER TABLE student DROP CONSTRAINT C1;
ALTER TABLE student ADD CONSTRAINT C1 CHECK(Sno BETWEEN 11111111 AND 999999999);
ALTER TABLE student DROP CONSTRAINT C3;
ALTER TABLE student ADD CONSTRAINT C3 CHECK(Sage<40);
五、域
域就是相当于c++中数据类型,当然我们知道,类相当于一个自定义的数据类型 ,在sql中我们也可以自己定义一个域,从而定义了一个自定义的数据类型;
sql支持域的概念,并可以通过CREATE DOMAIN语句建立一个域及该域应该满足的完整性约束条件,当域上的完整性约束条件改变时只需要修改域的定义即可,而不必修改域上的各个属性;
举个例子:建立一个性别域,并声明性别域的取值范围。
CREATE DOMAIN SexDomain CHAR(2) CHECK(VALUE IN('男','女');
这样学生表里的Ssex可以写为
Ssex SexDomain;