数据库作业12:第五章例题(5.1~5.20)
本文可分为以下几个部分
实体完整性
- 关系模型的完整性在CREATE TABLE中用PRIMARY KEY定义。
为方便实验与记录,创建新的数据库。
[例5.1]将Student表中的Sno属性定义为码;
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),
-- PRIMARYKEY(Sno)
--);
[例5.2]将SC表中的Sno、Cno属性组定义为码。
CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY(Sno,Cno)
);
参照完整性
- 关系模式的参照完整性在CREATE TABLE中用FOREIGN
KEY短语定义哪些列为外码,用REFERENCES短语指明这些外码参照哪些表的主码。
[例5.3]定义SC中的参照完整性。
参照完整性中有关于课程Course表,先建立Course表。
CREATE TABLE Course(--课程表
Cno CHAR(4) PRIMARY KEY,--列级完整性,不能取空值
Cname CHAR(40) NOT NULL,
Cpno CHAR(4),--先修课
Ccredit SMALLINT,
FOREIGN KEY(Cpno) REFERENCES Course(Cno)--表级完整性,Cpno为外码,参照Course表中的Cno列
);
然后定义SC表中的参照完整性。
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),--在表级定义参照完整性
FOREIGN KEY(Cno)REFERENCES Course(Cno)--在表级定义参照完整性
);
- 一般地,当对参照表和被参照表的操作违反了参照完整性时,系统选用默认策略,即拒绝执行。如果想让系统采用其他策略则必须在创建参照表时显式地加以说明。
[例5.4]显式说明参照完整性的违约处理示例。
按照课本语句,出现了报错,提示FOREIGN附近有语法错误
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,--删除Student表中的元组时,级联删除SC中相应的元素
ON UPDATE CASCADE,--当更新Student表中的sno时,级联更新SC表中的相应元组
FOREIGN KEY(Cno)REFERENCES Course(Cno)
ON DELETE NO ACTION--当删除Course表中的元组造成与SC表不一致时,拒绝删除
ON UPDATE CASCADE--当更新Course表中的Cno时,级联更新SC表中相应的元组
用户定义的完整性
- 用户定义的完整性就是针对某一具体应用的数据必须满足的语义要求。目前的关系数据库管理系统都提供了定义和检验这类完整性的机制,使用了和实体完整性、参照完整性相同的技术方法来处理他们,而不必由应用程序承担这一功能。
1、属性上的约束条件
在CREATE TABLE中定义属性的同时,可以根据应用要求定义属性上的约束条件,即属性值限制,包括:
- 列值非空(NOT NULL)。 列值唯一(UNIQUE)。 检查列值是否满足一个条件表达式(CHECK短语)。
1)不允许取空值
[例5.5]在定义SC表时,说明Sno、Cno、Grade属性不允许取空值。
CREATE TABLE SC
(Sno CHAR(9) NOT NULL,--不允许取空值
Cno CHAR(4) NOT NULL,--不允许取空值
Grade SMALLINT NOT NULL,--不允许取空值
PRIMARY KEY(Sno,Cno),--在表级定义实体完整性,隐含了Sno、Cno不允许取空值,在列级不允许取空值的定义可不写
);
2)列值唯一
[例5.6]建立部门表DEPT,要求部门名称Dname列取值唯一,部门编号Deptno列为主码。
CREATE TABLE DEPT
(Deptno NUMERIC(2),
Dname CHAR(9) UNIQUE NOT NULL,
Location CHAR(10),
PRIMARY KEY