实验报告(八)
1. 实验目的
1) 了解数据库完整性约束的概念和作用
2) 掌握SQL命令创建、修改、删除约束的方法
2. 准备知识
1) 数据库完整性约束的基本概念和分类
2) SQL语句创建、删除约束的语法
3. 实验内容和步骤
1) 给下面的表添加主键
Student表
列名 |
类型 |
是否允许为空 |
是否主外键 |
字段说明 |
sno |
char(10) |
not null |
主键 |
学号 |
sname |
char(10) |
not null |
姓名 |
|
sex |
char(1) |
not null |
性别 |
|
birth |
date |
not null |
出生日期 |
|
source |
varchar(16) |
null |
生源地 |
|
clno |
char(10) |
not null |
班级号 |
|
tel |
char(11) |
null |
电话 |
|
point |
smallint |
null |
入学成绩 |
|
credit |
smallint |
null |
学分 |
|
picture |
varchar(30) |
null |
照片(存放地址) |
|
|
varchar(30) |
null |
电子邮箱 |
|
remark |
text |
null |
字段说明 |
Course表
列名 |
数据类型(宽度) |
是否允许为空 |
是否主外键 |
字段说明 |
cno |
char(6) |
not null |
主键 |
课程号 |
cname |
varchar(16) |
not null |
课程名 |
|
credit |
tinyint |
not null |
学分 |
|
hour |
smallint |
not null |
学时 |
|
term |
tinyint |
not null |
开课学期(取值范围1-8) |
Score表
列名 |
类型 |
是否允许为空 |
是否主外键 |
字段说明 |
sno |
char(10) |
not null |
主键(外键) |
学生编号 |
cno |
char(6) |
not null |
主键(外键) |
课程编号 |
score |
decimal(4,1) |
null |
期末成绩 |
|
usual |
decimal(4,1) |
null |
平时成绩 |
给Student表添加主键:
ALTER TABLE Student ADD PRIMARY KEY (sno);
给Course表添加主键:
ALTER TABLE Course ADD PRIMARY KEY (cno);
给Score表添加主键:
ALTER TABLE Score ADD PRIMARY KEY (sno, cno);
2) 利用SQL语句给course_class表的tno列设置恰当的外键
ALTER TABLE course_class
ADD CONSTRAINT FK_course_class_teacher
FOREIGN KEY (tno) REFERENCES teacher(tno);
3) 利用SQL语句为class表的clname与department增加UNIQUE约束,以保证同一个院系的班级不会重名。
ALTER TABLE class
ADD CONSTRAINT UC_class_clname_department
UNIQUE (clname, department);
(4)-(7)题如果自己的mysql版本不支持check,只需写出代码即可,无需截图
4) 利用SQL语句为student表的point列创建CHECK约束,规定入学成绩的取值范围为200~900。
ALTER TABLE student
ADD CONSTRAINT CHK_student_point
CHECK (point BETWEEN 200 AND 900);
5) 利用SQL语句为teacher表的department列上创建CHECK约束。规定教师院系取值只能为“教务处”、“计算机学院”、“金融学院”和“化工学院”
ALTER TABLE teacher
ADD CONSTRAINT CHK_teacher_department
CHECK (department IN ('教务处', '计算机学院', '金融学院', '化工学院'));
6) 利用SQL语句为course表创建CHECK约束,规定学时除以学分必须大于等于16。
ALTER TABLE course
ADD CONSTRAINT CHK_course_hour_credit
CHECK (hour / credit >= 16);
7) 利用SQL语句删除student表中point列上的CHECK约束。
ALTER TABLE student
DROP CONSTRAINT CHK_student_point;
8) 利用SQL语句给score表的cno和sno列分别设置恰当的外键,要求当更新course表上的课程编号时,score表上的课程编号也随之更新,当删除student表中的学生时,该学生的在score表中的选课信息也随之删除
ALTER TABLE score
ADD CONSTRAINT FK_score_course
FOREIGN KEY (cno) REFERENCES course(cno)
ON UPDATE CASCADE;
ALTER TABLE score
ADD CONSTRAINT FK_score_student
FOREIGN KEY (sno) REFERENCES student(sno)
ON DELETE CASCADE;
9) 利用SQL语句在teacher表的tname列上创建唯一索引UQ_tname。用insert语句向teacher表中如下教师信息,并观察语句执行结果:
教师编号 |
教师姓名 |
密码 |
性别 |
电话 |
院系 |
身份 |
说明 |
0301 |
刘元朝 |
0301 |
男 |
Null |
机械学院 |
1 |
Null |
CREATE UNIQUE INDEX UQ_tname ON teacher (tname);
INSERT INTO teacher (tno, tname, password, gender, phone, department, identity)
VALUES ('0301', '刘元朝', '0301', '男', NULL, '机械学院', '1');