《数据库系统原理》实验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/)

  • 8
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验九:数据库完整性约束 一、实验目的 1. 掌握主键约束、外键约束及check约束的用法; 2. 掌握默认值约束和默认值对象的应用; 3. 掌握用触发器实现参照完整性的方法。 二、实验学时 2学时 三、实验要求 1. 了解约束、默认值; 2. 了解触发器的定义方法; 3. 掌握触发器的编写和运行方法 4. 完成实验报告。 四、实验内容 1. 数据完整性。以实验数据库为基础数据,请使用T- SQL语句完成以下内容,并将SQL语句写在实验报告册中: 1) 将数据库stu的course的cno字段定义为主键,约束名称为cno_pk; 2) 为course中的字段cname添加唯一值约束; 3) 对于数据sc的sno、cno字段定义为外码,使之与student的主码sno及cours e的主码cno对应,实现如下参照完整性: 删除student中记录的同时删除sc中与该记录sno字段值相同的记录; 修改student某记录的sno时,若sc中与该字段值对应的有若干条记录,则拒绝 修改; 修改coursecno字段值时,该字段在sc中的对应值也应修改; 删除course一条记录时,若该字段在在sc中存在,则删除该字段对应的记录; 向sc添加记录时,如果该记录的sno字段的值在student中不存在,则拒绝插入; 4)定义check约束,要求学生学号sno必须为9位数字字符,且不能以0开头,第二三 位皆为0; 5)定义stu数据库中student中学生年龄值在16~25范围内; 6)定义stu数据库student中学生年龄值默认值为20; 7) 修改student学生的年龄值约束可以为15~30范围内; 8) 删除course中字段cname的唯一值约束; 2. 以实验数据库为基础数据,编写以下触发器并测试。 1) 为course建立一个 INSERT触发器,当插入的新行中课程学分(ccredit)的值不是1~6时,就激活该出发器 ,撤销该插入操作,并使用RAISERROR语句返回一个错误信息。 2)为course创建一个UPDATE触发器,当更新了某门课程的课程号信息时,就激 活该触发器级联更新sc中相关的课程号信息,并使用PRINT语句返回一个提示信息 。 3)为student创建DELECT触发器,在删除中的一条记录的同时将sc中的相应记录 也删除。 4)创建INSTEAD OF触发器,当向sc中插入记录时,先检查sno列上的值在student中是否存在,如果 存在执行插入操作,如果不存在则提示"该学生不存在"。 5)比较约束与触发器的执行顺序。(在一个创建CHECK约束和触发器,然后向中 插入一条不符合约束和触发器的记录,察看谁先发生作用。)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值