【数据库】基础知识总结
数据库完整性 为了维护数据库完整性DBMS需要提供: 1. 提供定义完整性约束条件的机制 2. 提供完整性检查方法:一般在INSERT UPDATE DELETE语句执行后开始检查或者在事物提交之前进行检查 3. 违约处理机制:比如拒绝,级联或者其他操作 实体完整性 用PRIMARY
数据库完整性
为了维护数据库完整性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) REFERENCES Sudent(Sno)
ON DELETE CASCADE
ON UPDATE CASCADE,
FOREIGN KEY (Cno) REFERENCES Course(Cno)
ON DELETE NO ACTION
ON UPDATE CASCADE,
);
用户自定义完整性
根据具体应用而定义的数据必须满足的语义要求。分类:
- 列值非空(NOT NULL 短语)
- 列值唯一(UNIQUE 短语)
- 检查列值是否满足布尔表达式(CHECK 短语)
CREATE TABLE SC(
Sno CHAR(9) UNIQUE,
Cno CHAR(4) NOT NULL,
Grade SMALLINT CHECK(Grade >=0 AND Grade 100),
.....
PRIMARY KEY(Sno, Cno),
FOREIGN KEY (Sno) REFERENCES Sudent(Sno),
FOREIGN KEY (Cno) REFERENCES Course(Cno),
);