三、数据库完整性
3.1维护完整性的三个条件
- 提供定义完整性约束条件的机制
- 提供完整性检查方法
- 违约处理
3.2完整性分类
- 实体完整性:主码不能为空。
- 参照完整性:外码所对应的值必须为对应表的主码或空值。
- 用户定义完整性:某些属性值要收用户的定义而被约束。
3.3实体完整性
3.3.1完整性定义
在创建表时(create table),使用primary key定义。
[例]:
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)
)
Sno即为定义的主码。
3.3.2完整性检查和违约处理
实体完整性有两项自动检查,
-
检查主码值是否唯一,如果不唯一则拒绝插入或修改
-
检查主码值是否为空,为空则拒绝插入或修改
为了方便检查主码会自动创建索引,索引的存储格式为b+数,具体实现请参照“数据结构 b树”的讨论。
3.4参照完整性
3.3.1参照完整性定义
在create table中使用foreign key短语来定义哪些列为外码,用reference短语来指明这些外码参照哪些表的主码。
[例]:
CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY (Sno,Cno),
FOREIGN KEY (Sno) REFERENCE Student(Sno),
FOREIGN KEY (Cno) REFERENCE Course(Cno)
);
上段代码为表SC定义了表级约束条件主码为Sno和Cno,同时Sno,Cno分别为表Student,Course的外码。
3.3.2参照完整性检查和违约处理
以SC表和Student表为例,破坏参照完整性的情况大致有一下四种情况。
-
SC表中增加一个元组,元组的Sno属性在Student中找不到。
-
修改SC表中的元组,Sno属性在Student中找不到。
-
从Student表中删除一个元组,使SC表中的Sno属性在表Student中找不到对应元组。
-
修改Student表,使SC表中的Sno属性在表Student中找不到对应元组。
被参照表 | 参照表 | 违约处理 |
可能破坏参照完整性 | 插入元素 | 拒绝 |
可能破坏参照完整性 | 修改外码值 | 拒绝 |
删除元组 | 可能破坏参照完整性 | 拒绝/级连/置空 |
修改主码值 | 可能破坏参照完整性 | 拒绝/级连/置空 |
显示说明参照完整性违约处理示例。