数据库的完整性
数据库的完整性是指数据的正确性和相容性数据的正确性,是指数据是符合现实世界语义,反映了当前实际状况的数据的相容性 ,是指数据库同一对象在不同关系表中的数据是符合逻辑的数据要符合客观世界的要求,如学号只能是唯一的,性别只有男女,要有课程才能选课等。为维护数据库的完整性,数据库管理系统必须:1. 提供定义完整性约束条件的机制完整性约束条件也称为完整性规则,是数据库中的数据 必须满足的语义约束条件SQL 标准使用了一系列概念来描述完整性,包括关系模型的实体完整性、参照完整性和用户定义完整性这些完整性一般由 SQL 的数据定义语言语句来实现2. 提供完整性检查的方法数据库管理系统中检查数据是否满足完整性约束条件的机制称为完整性检查。一般在 INSERT 、 UPDATE 、 DELETE 语句执行后开始检 查,也可以在事务提交时检查3. 违约处理数据库管理系统若发现用户的操作违背了完整性约束条件,就采取一定的动作拒绝( NO ACTION )执行该操作级连( CASCADE )执行其他操作
1、实体完整性
在创建表时用primary key定义 primary key——定义主码 主码可以是单个属性,也可以是多个属性的集合。
1.1定义实体完整性
实体完整性的约束条件 1.列级约束条件,2.表级约束条件
列级约束条件
在快要写完一个属性(可以看作一行)后,在后面用primary key 定义列级约束条件
表级约束条件
在写完所有的属性列后,再快要结束的时候将上述所写的属性,用
primary key(属性1,属性2.……)定义表级约束条件
对于单个属性构成的主码,我们既可以使用列级约束条件也可以用表级约束条件。
多个属性构成的主码,我们只能用表级约束条件。
2.1实体完整性检查和违约处理
插入或对主码列进行更新操作时,关系数据库管理系统按照实体完整性规则自动进行检查。包括:1、检查主码值是否唯一,如果不唯一则拒绝插入或修改主码可以有多个属性合在一起,但每个属性中的元组不能是有重复的值2、检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改主码是不能为空的,多个属性构成的主码,则这多个属性都不能为空检查记录中的主码值是否唯一的一种方法是全表扫描——依次判断表中每一天记录的主码值与将插入记录的主码值是否相同。
但是全表扫描很浪费时间,为了避免其进行扫描,关系数据库管理系统一般都在主码上自动建立一个索引——B+树索引(还没学过B+树,后面再补)。
2、参照完整性
参照完整性就是表于表之间的关系构成的一个完整性。在 CREATE TABLE 中用 FOREIGN KEY(外键) 短语定义哪些列为外码用 REFERENCES 短语指明这些外码参照哪些表的主码。
参照完整性只能在表级定义,我的外键只能是你的主码。
你的表中作为主码被我参照(引用)作为我的表的外键,你被我参照,你被称为被参照表(主表)我被称为子表(从表)
参照完整性检查和违约处理
参照完整性违约处理 , 参照完整性的约束条件( 1 ) 拒绝( NO ACTION )执行不允许该操作执行。该策略一般设置为默认策略( 2 ) 级联( CASCADE )操作当删除或修改被参照表( Student )的一个元组造成了 与参照表( SC )的不一致,则删除或修改参照表中的 所有造成不一致的元组( 3 )设置为空值( SET-NULL )当删除或修改被参照表的一个元组时造成了不一致,则 将参照表中的所有造成不一致的元组的对应属性设置为 空值
被参照表
参照表 违约处理 可能破坏参照完整性 插入元组 拒绝 可能破坏参照完整性 修改外码值拒绝 参照表的外键就是被参照表的主码
参照表中插入元组中包含外键,但是被参照表主码没有这个元组,被参照表的主码没有这个值,那么进行参照表进行插入元组是会被拒绝(被参照表没有这个元组对应的主码,参照表就不能插入这个元组)
修改外码值与插入一样,如果你修改后外码在在被参照表中找不到主码元组,则拒绝。
被参照表
参照表 违约处理 删除元组可能破坏参照完整性 拒绝 / 级连删除 / 设置为空值 修改主码值 可能破坏参照完整 性 拒绝 / 级连删除 / 设置为 空值被参照表是主表,当主表中主码对应的值进行删除时,参照表的外键也包含这这个值 ,就会分情况进行违约处理。
1、拒绝删除,
2、级联删除,主表对应主码的元组删除了,子表对应的也删除。
3、设置为空值,当删除或修改被参照表的一个元组时造成了不一致,则 将参照表中的所有造成不一致的元组的对应属性设置为空值。
这里我们要定义参照完整性时进行选择参照完整性
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 /* 级联删除 SC 表中相应的元组 */ ON UPDATE CASCADE, /* 级联更新 SC 表中相应的元组 */ FOREIGN KEY (Cno) REFERENCES Course(Cno) ON DELETE NO ACTION /* 当删除 course 表中的元组造成了与 SC 表不一致时拒绝删除 */ ON UPDATE CASCADE /* 当更新 course 表中的 cno 时,级联更新 SC 表中相应的元组 */ );
对于参照完整性,除了定义外码,还应定义外码列是否允许取空值。
建议:
对于delete(删除操作),当删除被参照表中的元组,造成于参照表的不一致时,拒绝删除被参照表的元组。
对于update(更新操作),则采用级联更新,当被参照表中的元组更新,对应的将参照表的元组也更新。
3、用户定义的完整性
用户定义的完整性是:针对某一具体应用的数据必须满足的语义要求如性别只能取男和女两个选择不能是其他的关系数据库管理系统提供了定义和检验用户定义完整性的机制,不必由应用程序承担
3.1属性上的约束条件
(1)列值非空( NOT NULL )(2)列值唯一( UNIQUE )(3)检查列值是否满足一个条件表达式( CHECK )create tableCREATE TABLE Studet1( SNO CHAR(9) PRIMARY KEY NOT NULL, SNAME VARCHAR(20) UNIQUE NOT NULL, SSEX CAHR(5)CHECK(SSEX IN ('男','女')) );
不允许取空值列值唯一检查列值是否满足一个条件表达式( CHECK )
3.2属性上的约束条件检查和违约处理
插入元组或修改属性的值时,关系数据库管理系统检查属性上的约束条件是否被满足如果不满足则操作被拒绝执行
3.3元组上约束条件的定义
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. 打头
3.4元组上约束条件检查和违约处理
插入元组或修改属性的值时,关系数据库管理系统检 查元组上的约束条件是否被满足 如果不满足则操作被拒绝执行
4、完整性约束命名子句
4.1命名
用于完整性约束条件命名,从而更加灵活的删除一个完整性约束条件。
语法:完整性约束命名子句 CONSTRAINT < 完整性约束条件名 >< 完整性约束条件 >
CREATE TABLE Student ( Sno NUMERIC(6) CONSTRAINT C1 CHECK (Sno BETWEEN 90000 AND 99999), Sname CHAR(20) CONSTRAINT C2 NOT NULL, Sage NUMERIC(3) CONSTRAINT C3 CHECK (Sage < 30), Ssex CHAR(2) CONSTRAINT C4 CHECK (Ssex IN ( ‘ 男’ ,' 女 ')), CONSTRAINT StudentKey PRIMARY KEY(Sno) );
在 Student 表上建立了 5 个约束条件,包括主码约束(命名为StudentKey )以及 C1 、 C2 、 C3 、 C4 四个列级约束。4.2修改完整性
去掉表中年龄小于30的约束
ALTER TABLE Student DROP CONSTRAINT C3;修改约束条件的话,可以先删除原来的约束条件,再增加新的约束条件。如将学号改为再1~100之间先删除:ALTER TABLE Student DROP CONSTRAINT C1;再增加:ALTER TABLE StudentADD CONSTRAINT C1 CHECK (Sno BETWEEN 1 AND 100);
相关语句 | 说明 |
show create table student | 详细展示student表的结构,属性,完整性等 |
select *from student | 显示student表的全部数据,*是一个通配符 |
drop table student; | 将student表删除 |