熟练掌握使用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/)