数据库完整性
为了维护数据库完整性DBMS需要提供:
1. 提供定义完整性约束条件的机制
2. 提供完整性检查方法:一般在INSERT UPDATE DELETE语句执行后开始检查或者在事物提交之前进行检查
3. 违约处理机制:比如拒绝,级联或者其他操作
实体完整性
用PRIMARY KEY进行定义,对于单属性,实体完整性可以定义为列级约束也可以定义为表级约束;对于多个属性构成的码,只能定义为表级约束。
例如:
定义为列级约束(列级主码)
CREATE TABLE S(
Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20) NOT NULL,
.....
);
定义为表级约束(表级主码)
CREATE TABLE S(
Sno CHAR(9) ,
Sname CHAR(20) NOT NULL,
.....
PRIMARY KEY(Sno)
);
检查和违约处理:
1. 检查主码值是否唯一,如果不唯一就拒绝插入或者修改(全表扫描或者在DBMS为主码建立的索引上进行查找,例如B+树索引)
2. 检查主码值对应的各个属性是否为空,如果存在为空的属性,那么拒绝插入或者修改
参照完整性
在创建表的时候使用FOREIGN KEY 定义外码,用REFERENCES短语指定这些外码参照哪些表的主码。和主码类似,外码也同样可以定义表级和列级参照完整性。不过感觉没什么区别
例如:
CREATE TABLE SC(
Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
.....
PRIMARY KEY(Sno, Cno),
FOREIGN KEY (Sno) REFERENCES Sudent(Sno),
FOREIGN KEY (Cno) REFERENCES Course(Cno),
);
破坏参照完整性的情形以及违约处理:
1. SC表中插入一个元组但是该元组的Sno属性在被参照表Student中是不存在的
2. SC表中更新一个元组但是该元组的Sno属性在被参照表Student中是不存在的
3. Student表中删除一个元组,导致参照表SC中某些元组的Sno在Student表中不存在
4. Student表中更新一个元组,导致参照表SC中某些元组的Sno在Student表中不存在
发生不一致的时候一般采取的措施是:
1. 拒绝执行
2. 级联操作:删除或者修改被参照表导致不满足参照完整性的时候,级联删除惨遭表中所有的不一致元组
3. 设置空值(这也引起一个问题就是在定义外码的时候是否允许外码列为空,如果不允许为空,那么就不能按3来处理)
至于采用哪种处理策略,可以在建表的时候显式指定
CREATE TABLE SC(
Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
.....
PRIMARY KEY(Sno, Cno),
FOREIGN KEY (Sno)