《数据库系统原理》实验9:数据库的完整性设计

一、实验目的

熟练掌握使用Navicat和Transact-SQL语言两种方法创建、修改和删除表。掌握管理表的有关系统存储过程。

二、实验内容

1、利用Navicat创建满足以下要求的数据库:①数据库存在于连接MySQL中;②数据库名称为xsgl; ③字符集选择utf8 -- UTF-8 Unicode;排序规则选择utf8_general_ci。

2、在数据库xsgl中,利用Navicat和SQL语句创建以下表格:

1)表格名为xs(学生基本情况表),表格中各个属性的定义如下:

列名

含义

数据类型

长度

能否取空值

备注

xh

学号

int

no

xm

姓名

char

8

yes

xb

性别

char

2

yes

nl

年龄

tinyint

yes

zy

专业

char

16

yes

jtzz

家庭住址

char

50

yes

2)表格名为kc(课程情况表),表格中各个属性的定义如下:

列名

含义

数据类型

长度

能否取空值

备注

xh

学号

int

no

kch

课程号

Int

no

kcm

课程名

char

20

yes

xss

学时数

int

yes

xf

学分

int

yes

fs

分数

Int

yes

1、 在xs表中定义xh为主键。

2、在kc表中定义xh和kch联合构成主键。

3、定义kc表中的kcm列满足唯一性约束。

4、定义kc表中的fs列默认值为0。

5、定义xs表中的xb列的CHECK约束“男”或“女”。

6、在xs表与kc表之间定义外键xh。

xs表:

①Navicat:

②SQL:

输入以下代码并运行:

CREATE TABLE xs 
( 
    xh int NOT NULL, 
    xm char(8) NULL, 
    xb char(2) NULL CHECK (xb='男' OR xb='女'), 
    nl tinyint NULL, 
    zy char(16) NULL, 
    jtzz char(50) NULL, 
    primary key(xh) 
) 

kc表:

①   Navicat:

②SQL:

输入以下代码并运行: 

CREATE TABLE `kc` ( 
    `xh`  int NOT NULL , 
    `kch`  int NOT NULL , 
    `kcm`  char(20) NULL , 
    `xss`  int NULL , 
    `xf`  int NULL , 
    `fs`  int NULL DEFAULT 0 , 
    PRIMARY KEY (`xh`, `kch`), 
    UNIQUE INDEX (`kcm`)  
);

添加外键:

输入以下代码并运行:

ALTER TABLE `kc` ADD INDEX (`xh`); 
ALTER TABLE `xs` ADD FOREIGN KEY (`xh`) REFERENCES `kc` (`xh`); 

7、以下将创建一个学生—课程数据库,包括学生关系Student、课程关系Course和选修关系SC:

①建立学生-课程数据库xskc,创建Student表,并将Student表中的Sno属性定义为主键。

输入以下代码并运行:

CREATE TABLE Student 
( 
    Sno CHAR(9) PRIMARY KEY, 
    Sname CHAR(20) NOT NULL, 
    Ssex CHAR(2), 
    Sage SMALLINT, 
    Sdept CHAR(20) 
) 

结果如下图所示:

②创建Course表和SC表,并将SC表中的Sno,Cno联合构成主键。

输入以下代码并运行:

USE xskc; 
CREATE TABLE Course 
( 
    Cno CHAR(9) PRIMARY KEY, 
    Cname CHAR(20), 
    Cpno CHAR(4), 
    Ccredit SMALLINT 
) ; 
CREATE TABLE SC 
( 
    Sno CHAR(9) NOT NULL, 
    Cno CHAR(9) NOT NULL, 
    Grade SMALLINT, 
    PRIMARY KEY(Sno,Cno) 
) 

    结果如下图所示:

③定义SC表中的参照完整性

输入以下代码并运行:

USE xskc; 
ALTER TABLE SC ADD FOREIGN KEY (Sno) REFERENCES Student(Sno); 
ALTER TABLE SC ADD FOREIGN KEY (Cno) REFERENCES Course(Cno); 

结果如下图所示:

④显示说明参照完整性的违约处理示例

输入以下代码并运行:

USE xskc; 
ALTER TABLE SC 
ADD 
FOREIGN KEY (Sno) REFERENCES Student(Sno) 
ON DELETE CASCADE 
ON UPDATE CASCADE; 
ALTER TABLE SC 
ADD
FOREIGN KEY (Cno) REFERENCES Course(Cno) 
ON DELETE NO ACTION 
ON UPDATE CASCADE; 

结果如下图所示:

⑤定义SC表Grade属性不允许为空

输入以下代码并运行:

USE xskc; 
ALTER TABLE SC CHANGE Grade Grade SMALLINT NOT NULL; 

结果如下图所示:

三、课后练习题

1、新建名为SPJ的数据库。(其中数据表S、P、J和SPJ的关系模式及其含义见实验八)

2、在数据库SPJ中,合理地为库中每一个数据表定义主键和外键。

s表:

p表:

j表:

spj表:

3、适当为各数据表及其字段添加约束(唯一性、默认值等)

s表:

p表:

j表:

四、思考题

1、使用参考语句创建好xs和kc两个表之后,语句中对于xb列的CHECK约束是否起作用?如果未起作用,思考语句通过却未起作用的原因。

以上内容成功保存,说明CHECK约束未起作用。

MySQL 8.0.15或更早版本不支持CHECK约束,查阅MySQL官方文档,文档中有此内容:“该CHECK子句被解析但被所有存储引擎忽略”,说明check语句能正常执行,但是不生效,可以采用enum枚举类型来约束。

2、参考语句中参照完整性的违约处理示例“on delete cascade”和“on update cascade”的含义是什么?“on delete no action”又代表什么?

on update cascade是主键表中被参考字段的值更新

on delete cascade是指在主键表中删除一条记录:

on delete no action表示不做任何操作,

五、出现的问题及解决方案

问题:

ORDER BY关键字降序排序问题

SQL AND & OR 运算符与优先级问题

WHERE语句的特殊条件——例如is null、between and、like模糊查询等问题

Enum枚举类型的设定值问题

CHECK语句约束不起作用问题

解决方案:

参考《数据库系统概论课本》、菜鸟教程(https://www.runoob.com/sql)、CSDN博客和MySQL参考手册(https://dev.mysql.com/doc/)

发布了79 篇原创文章 · 获赞 100 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/lee1hong/article/details/105763306