第五章、数据库完整性
数据的正确性和相容性。
实体完整性检查和违约处理:检查主码值是否唯一,如果不唯一则拒绝插入或修改;检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改
参照完整性检查和违约处理:
用户定义的完整性:
- 属性上的约束条件的定义:列值非空(NOT NULL);列值唯一(UNIQUE);检查列值是否满足一个布尔表达式(CHECK)
- 插入元组或修改属性的值时,RDBMS检查属性上的约束条件是否被满足,如果不满足则操作被拒绝执行。
5.1 完整性约束命名子句
CONSTRAINT<完整性约束条件名><完整性约束条件>
建立学生登记表Student,要求学号在90000~99999之间,姓名不能取空值,年龄小于30,性别只能是“男”或“女”。
CREATE TABLE Student
(Sno NUMERIC(6)
CONSTRAINTCI 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)
);
去掉例5.10 Student表中对性别的限制。
ALTER TABLE Student
DROP CONSTRAINT C4;
修改表Student中的约束条件,要求学号改为在900 000~999 999之间,年龄由小于30改为小于40。可以先删除原来的约束条件,再增加新的约束条件。
ALTER TABLE Student
DROP CONSTRAINTC1;
ALTER TABLE Student
ADD CONSTRAINT CI CHECK(Sno BETWEEN 900000 AND 999999);
5.2 断言
CREATE ASSERTION<断言名><CHECK子句>
限制每一门课程最多60名学生选修。
CREATE ASSERTION ASSE_SC_ CNUM1
CHECK( 60>=ALL ( SELECT count(*)/*此断言的谓词,涉及聚集操作count*/
FROM SC /*和分组函数group by 的SQL语句*/
GROUP by cno )
);
删除断言的语句格式:
DROP ASSERTION<断言名>;
5.3 触发器
SQL使用CREATE TRIGGER命令建立触发器,其一般格式为
CREATE TRIGGER<触发器名> /*每当触发事件发生时,该触发器被激活*/
{BEFORE |AFTER}<触发事件> ON<表名> /*指明触发器激活的时间是在执行触发事件前或后*/
REFERENCING NEW|OLD ROW AS<变量>/*REFERENCING指出引用的变量*/
FOR EACH{ROW |STATEMENT}/*定义触发器的类型,指明动作体执行的频率*/
[WHEN<触发条件>]<触发动作体>/*仅当触发条件为真时才执行触发动作体*/
当对表SC的Grade属性进行修改时,若分数增加了10%,则将此次操作记录到另一个表SC_U(Sno、Cno、Oldgrade、Newgrade)中,其中 Oldgrade是修改前的分数,Newgrade是修改后的分数。
CREATE TRIGGER SC_T /*SC_T是触发器的名字*/
AFTER UPDATE OF Grade ON SC /*UPDATE OF Grade ON SC是触发事件,*/
/*AFTER是触发的时机,表示当对SC的Grade属性修改完后再触发下面的规则*/
REFERENCING
OLDROWAS OldTuple,
NEWROWAS NewTuple
FOR EACH ROW /*行级触发器,即每执行一次Grade的更新,下面的规则就执行一次*/
WHEN (NewTuple.Grade >= 1.1 * OldTuple.Grade)/*触发条件,只有该条件为真时才执行*/
INSERT INTO SC_U (Sno,Cno,OldGrade,NewGrade)/*下面的insert操作*/
VALUES(OldTuple.Sno.OldTuple.Cno.OldTunle.Grade NewTiunle.Grade)
触发器激活时遵循如下的执行顺序:
(1)执行该表上的 BEFORE触友带。
(2)激活触发器的SQL语句。
(3)执行该表上的AFTER触发器。
删除触发器的SQL语法如下:
DROP TRIGGER<触发器名>ON<表名>;
第六章、关系数据理论
6.1 规范化
X函数确定Y” 或 “Y函数依赖于X”,记作X→Y。
如果X→Y,但Y
⊈
\nsubseteq
⊈X,则称X→Y是非平凡的函数依赖
若X→Y,但Y
⫅
\subseteqq
⫅X,则称X→Y是平凡的函数依赖
例:在关系SC(Sno,Cno, Grade)中:
非平凡函数依赖:(Sno, Cno)→Grade
平凡函数依赖:(Sno, Cno)→Sno
在R(U)中,如果X→Y,并且对于X的任何一个真子集X’,都有X’无法推出Y,则称Y对X完全函数依赖,记作X
→
F
\overset{F}{\rightarrow}
→FY。
若X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖,记作X
→
P
\overset{P}{\rightarrow}
→PY。
在R(U)中,如果X→Y,(Y ⊈ \nsubseteq ⊈X),Y无法推出X,Y→Z,(Z ⊈ \nsubseteq ⊈Y),则称Z对X传递函数依赖。记为:X → 传递 \overset{传递}{\rightarrow} →传递Z
定义6.4设K为R<U,F>中的属性或属性组合。若K
→
F
\overset{F}{\rightarrow}
→FU,则K称为R的侯选码(Candidate Key)。
注意:U是完全函数依赖于K,而不是部分函数依赖于K。如果U部分函数依赖于K,即K
→
P
\overset{P}{\rightarrow}
→PU,则K称为超码(Surpkey)。候选码是最小的超码,即K的任意一个真子集都不是候选码。若候选码多于一个,则选定其中的一个做为主码( Primary Key)。
主属性与非主属性:包含在任何一个候选码中的属性 ,称为主属性(Prime attribute) ;不包含在任何码中的属性称为非主属性(Nonprime attribute)或非码属性(Non-key attribute)
全码:整个属性组是码,称为全码(All-key)
如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF
若R∈1NF,且每一个非主属性完全函数依赖于码,则R∈2NF。
若R∈3NF,则每一个非主属性既不部分依赖于码也不传递依赖于码。
若R∈BCNF ,所有非主属性对每一个码都是完全函数依赖,所有的主属性对每一个不包含它的码,也是完全函数依赖,没有任何属性完全函数依赖于非码的任何一组属性
6.2 数据依赖的公理系统
Armstrong 公理系统(Armstrong’s axiom)设U为属性集总体,F是U上的一组函数依赖,于是有关系模式R<U,F>,对R<U,F>来说有以下的推理规则:
- A1自反律(reflexivity rule):若Y ⫅ \subseteqq ⫅X ⫅ \subseteqq ⫅U,则X→Y为F所蕴涵。
- A2增广律( augmentation rule):若X→Y为F所蕴涵,且Z ⫅ \subseteqq ⫅U,则XZ→YZ 为F所蕴涵。
- A3传递律(transitivity rule):若X→Y及Y→Z为F所蕴涵,则X→Z为F所蕴涵。
第七章、数据库设计
7.1 概念结构设计
7.2 逻辑结构设计
ER图向关系模式转换:
下面把图7.28中虚线上部的E-R图转换为关系模型。关系的码用加粗标出。
部门(部门号 ,部门名,经理的职工号,…)
职工(职工号、部门号,职工名,职务,…)
产品(产品号,产品名,产品组长的职工号,…)
供应商(供应商号,姓名,…)
零件(零件号,零件名,…)
参加(职工号,产品号,工作天数,…)
供应(产品号,供应商号,零件号,供应量)
一个1:1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并。
一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。
一个m:n联系转换为一个关系模式。
三个或三个以上实体间的一个多元联系转换为一个关系模式。
具有相同码的关系模式可合并。