第五章例题

数据库的完整性

  • 实体完整性
  • 参照完整性
  • 用户定义的完整性
    • 元组上的约束条件
  • 完整性约束命名子句
  • 断言

实体完整性

例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));

第五章例题_第1张图片
或者:

CREATE TABLE Student
(Sno CHAR(9) ,
Sname CHAR(20) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20),
PRIMARY KEY(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));

第五章例题_第2张图片

参照完整性

例5.3 定义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),
--表级完整性约束条件,Sno是外码,Student是被参照表
FOREIGN KEY(Cno)REFERENCES Course(Cno)
--表级完整性约束条件,Cno是外码,Course是被参照表
);

第五章例题_第3张图片
例5.4 显示说明参照完整性的违约处理示例
标准SQL语句下:

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表中相应的元组

用户定义的完整性

例5.6 在定义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));

例5.6 建立部门表DEPT,要求部门名称Dname列取值唯一,部门编号Deptno列为主码

CREATE TABLE DEPT
(Deptno NUMERIC(2),
Dname CHAR(9) UNIQUE NOT NULL,
Location CHAR(10),
PRIMARY KEY(Deptno));

第五章例题_第4张图片
例5.7 Student表的Ssex只允许取“男”或“女”

CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20) NOT NULL,
Ssex CHAR(2) CHECK(Ssex IN('男','女')),
Sage SMALLINT,
Sdept CHAR(20));

例5.8 SC表的Grade的值应该在0~100之间

CREATE TABLE SC
(Sno CHAR(9)NOT NULL,
Cno CHAR(4)NOT NULL,
Grade SMALLINT CHECK (Grade>=0 AND Grade<=100),
PRIMARY KEY(Sno,Cno), 
FOREIGN KEY(Sno)REFERENCES Student(Sno),
FOREIGN KEY(Cno)REFERENCES Course(Cno));

元组上的约束条件

例5.9 当学生的性别是男时,起名字不能以Ms.打头

CREATE TABLE Student
(Sno CHAR(9) ,
Sname CHAR(20) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20),
PRIMARY KEY(Sno),
CHECK (Ssex='女' OR Sname NOT LIKE 'Ms.%'))
;

完整性约束命名子句

完整性约束命名子句:

CONSTRAINT<完整性约束条件名><完整性约束条件>

例5.10 建立学生登记表Student,要求学号在90000~99999之间,姓名不能为空,年龄小于30岁,性别只能是男或女

CREATE TABLE Student2
(Sno NUMERIC(6) CONSTRAINT SSNO CHECK(Sno BETWEEN 90000 AND 99999),
Sname CHAR(20) CONSTRAINT SSNAME NOT NULL,
Sage NUMERIC(3) CONSTRAINT SSAGE CHECK(Sage<30),
Ssex CHAR(2) CONSTRAINT SSSEX CHECK(Ssex IN('男','女')),
CONSTRAINT STUDENTKEY PRIMARY KEY (Sno));

第五章例题_第5张图片
例5.11 建立教师表TEACHER,要求每个教师的应发工资不低于3000元。应发工资是工资列Sal与扣除项Deduct之和

CREATE TABLE TEACHER
(Eno NUMERIC(4)PRIMARY KEY,
Ename CHAR(10),
Job CHAR(8),
Sal NUMERIC(7,2),
Deduct NUMERIC(7,2),
Deptno NUMERIC(2),
CONSTRAINT TEACHERFKEY FOREIGN KEY (Deptno)
REFERENCES DEPT(Deptno),
CONSTRAINT SSUM CHECK(Sal+Deduct>=3000));

第五章例题_第6张图片
2.修改表中的完整性限制
例5.12 去掉例5.10Student2表中对性别的限制

ALTER TABLE Student2
DROP CONSTRAINT SSSEX;

第五章例题_第7张图片
例5.13 修改表Student2中的约束条件,要求学号改为在900000~999999之间,年龄有小于30改为小于40
需要先删除原来的约束条件,再增加新的约束条件

ALTER TABLE Student2
DROP CONSTRAINT SSNO;
ALTER TABLE Student2
ADD CONSTRAINT SSNO CHECK(Sno BETWEEN 900000 AND 999999);
ALTER TABLE Student2
DROP CONSTRAINT SSAGE;
ALTER TABLE Student2
ADD CONSTRAINT SSAGE CHECK (Sage<40);

第五章例题_第8张图片

断言

断言语句格式:

CREATE ASSERTION<断言名><CHECK子句>

例5.18 限制数据库课程最多60名学生选修

CREATE ASSERTION ASSE_SC_DB_NUM
CHECK(60>=(SELECT count(*)
FROM Course,SC 
WHERE SC.Cno=Course.Cno AND Course.Cname='数据库'));

第五章例题_第9张图片
例5.19 限制每一门课程最多60名学生选修

CREATE ASSERTION ASSE_SC_CNUM1
CHECK (60>=ALL(SELECT COUNT(*)
FROM SC GROUP BY Cno)

例5.20 限制每个学期每一门课程最多60名学生选修

alter TABLE SC ADD TERM DATE; --修改SC表增加TERM属性,类型是DATE
CREATE ASSERTION ASSE_SC_CNUM2
CHECK(60>=ALL(SELECT COUNT(*)
FROM SC GROUP BY Cno,TERM));

删除断言语句格式:

DROP ASSERTION <断言名>

注意:T-SQL 中没有 ASSERTION 功能。

类似的有RULE,但使用方法不同:

上下文中不允许使用子查询,只允许使用标量表达式。
总结:又熟悉了一遍建表,以及更加系统的建表流程,over,乏了乏了。。。

你可能感兴趣的:(数据库)