数据库系统概论(第五版)创建Student、Course、SC表的步骤

注:
1、此博客借鉴了中国人民大学王珊和萨师煊老师合著的《数据库系统概论(第五版)》,高等教育出版社出版。
2、使用的是MYSQL8.0以上的数据库,工具为MySQL Workbench
3、重点解决外键报错问题```Cannot add or update a child row: a foreign key onstraint fails (databaseexperiment.sc, CONSTRAINT sc_ibfk_2 FOREIGN KEY (Cno) REFERENCES course (Cno))
``
#准备工作为:安装好并可以使用的MYSQL,安装过程不在此赘述。

一、进入MSQL Workbench

点击Local insatance MYSQL连接进入,初次登入需要输入数据库密码(安装过程中设置的密码)。
在这里插入图片描述

二、创建Student、Course、SC表

步骤一

点击左上角File ——New Model——取一个名字(databaseexperiment)——Apply——Apply——Finsh。在左边点击刷新就可以看到自己建的连接,双击(加粗表示连接,正在使用这个连接)。
在这里插入图片描述

步骤二

建表方法一:非代码法建表

1、在Tables上右键点击Create Table…

在这里插入图片描述

2、对表取名字,表的属性名(双击才能填写)、属性类型、PK(主键)、NN(不允许为空)、UQ、、、其他的不再解释右下角有英文。

在这里插入图片描述

3、然后Apply到Finsh,表建成后就可以插入数据了。

建成的表还可以进行再次修改 把鼠标放到course(数据库里大小写都一样)表上,点击第二个按钮就可以再次修改,修改后Apply就OK了。
在这里插入图片描述

建表方法二:代码法建表

如图所示。
在这里插入图片描述

# 创建Student表
create table STUDENT
(Sno char(20)primary key,
Sname char(20)unique,
Ssex char(2),
Sage smallint,
Sdept char(20)
); 
#单句执行 用时按Ctrl和Enter键
#创建Course表
create table COURSE
(Cno char(4)primary key,
Cname char(40)not null,
Cpno char(4),
Ccredit smallint,
foreign key(Cpno)references COURSE (Cno)
); 
#创建SC表
create table SC
(Sno char(20),
Cno char(4),
Grade smallint,
primary key(Sno,Cno),
foreign key(Sno)references STUDENT(Sno),
foreign key(Cno)references COURSE(Cno)
);

三、对Sduent、Course、SC表插入数据时需要注意

(一)、Student表数据插入

# Student插入数据时这样没什么问题。
insert into STUDENT(Sno,Sname,Ssex,Sage,Sdept) values('201215121','李勇','男',20,'CS');
insert into STUDENT(Sno,Sname,Ssex,Sage,Sdept) values('201215122','刘晨','女',19,'CS');
insert into STUDENT(Sno,Sname,Ssex,Sage,Sdept) values('201215123','王敏','女',19,'MA');
insert into STUDENT(Sno,Sname,Ssex,Sage,Sdept) values('201215125','张立','男',19,'IS');
select *from student;#显示表 当然也可以点击再次修改表的右边那个表格图标
#多执行 用时按Ctrl、Shift、Enter键

在这里插入图片描述

(二)、Course表数据插入

但如果Course也按照Student表的方式插入时会有问题

在这里插入图片描述

报错:

在这里插入图片描述
insert into COURSE(Cno,Cname,Cpno,Ccredit)values(‘1’,‘数据库’,‘5’,4)
Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (databaseexperiment.course, CONSTRAINT course_ibfk_1 FOREIGN KEY (Cpno) REFERENCES course (Cno))

原因是:建Course表使用了以下这条语句,使用了外键,并且外键参考了表Course本身。一开始Course里面没有数据,但插入数据时却参考了Course表自身的Cpno(先修课)属性,违背了一致性和系统完整性。

foreign key(Cpno)references COURSE (Cno)

解决方法:

1、先插入部分数据
insert into COURSE(Cno,Cname)values('1','数据库');
insert into COURSE(Cno,Cname)values('2','数学');
insert into COURSE(Cno,Cname)values('3','信息系统');
insert into COURSE(Cno,Cname)values('4','操作系统');
insert into COURSE(Cno,Cname)values('5','数据结构');
insert into COURSE(Cno,Cname)values('6','数据处理');
insert into COURSE(Cno,Cname)values('7','PASCAL语言');
#这一块要先执行,再执行下面那块代码

在这里插入图片描述

2、再用更新语句“插入”剩余数据
update COURSE set Cpno='5',Ccredit = 4 where Cno = '1';
update COURSE set Cpno=NULL,Ccredit = 2 where Cno = '2';#注意不能将Cpno=NULL写成Cpno=''
update COURSE set Cpno='1',Ccredit = 4 where Cno = '3';
update COURSE set Cpno='6',Ccredit = 3 where Cno = '4';
update COURSE set Cpno='7',Ccredit = 4 where Cno = '5';
update COURSE set Cpno=NULL,Ccredit = 2 where Cno = '6';
update COURSE set Cpno='6',Ccredit = 4 where Cno = '7';

在这里插入图片描述

(三)、SC表数据插入

#虽然SC表也使用了外键,但在Course插入数据之后可以按常规方法插入
#先把Course数据插入之后再对SC表进行插入数据
insert into SC(Sno,Cno,Grade) values('201215121','1',92);
insert into SC(Sno,Cno,Grade) values('201215121','2',85);
insert into SC(Sno,Cno,Grade) values('201215121','3',88);
insert into SC(Sno,Cno,Grade) values('201215122','2',90);
insert into SC(Sno,Cno,Grade) values('201215122','3',80);
select *from SC; 

在这里插入图片描述
到此Student、Course、SC表就建好了。感谢阅读,祝学业有成!

初学者写的博客难免有缺陷,还请各位提出宝贵意见!

交互式SQL的使用 环境:WINDOWS,Microsoft SQL Server 实验要求: 1,创建Student数据库,包括Students,Courses,SC结构如下: Students(SNO,SNAME,SEX,BDATE,HEIGHT,DEPARTMENT) Courses(CNO,CNAME,LHOUR,CREDIT,SEMESTER) SC(SNO,CNO,GRADE) (注:下划线示主键,斜体示外键),并插入一定数据。 2.完成如下的查询要求及更新的要求。 (1)查询身高大于1.80m的男生的学号和姓名; (2)查询计算机系秋季所开课程的课程号和学分数; (3)查询选修计算机系秋季所开课程的男生的姓名、课程号、学分数、成绩; (4)查询至少选修一门电机系课程的女生的姓名(假设电机系课程的课程号以EE开头); (5)查询每位学生已选修课程的门数和总平均成绩; (6)查询每门课程选课的学生人数,最高成绩,最低成绩和平均成绩; (7)查询所有课程的成绩都在80分以上的学生的姓名、学号、且按学号升序排列; (8)查询缺成绩的学生的姓名,缺成绩的课程号及其学分数; (9)查询有一门以上(含一门)三个学分以上课程的成绩低于70分的学生的姓名; (10)查询1984年~1986年出生的学生的姓名,总平均成绩及已修学分数。 (11) 在STUDENTSC关系中,删去SNO以’01’开关的所有记录。 (12)在STUDENT关系中增加以下记录: (13)将课程CS-221的学分数增为3,讲课时数增为60 3.补充题: (1) 统计各系的男生和女生的人数。 (2) 列出学习过‘编译原理’,‘数据库’或‘体系结构’课程,且这些课程的成绩之一在90分以上的学生的名字。 (3) 列出未修选‘电子技术’课程,但选修了‘数字电路’或‘数字逻辑’课程的学生数。 (4) 按课程排序列出所有学生的成绩,尚无学生选修的课程,也需要列出,相关的学生成绩用NULL示。 (5) 列出平均成绩最高的学生名字和成绩。(SELECT句中不得使用TOP n子句) 4.选做题:对每门课增加“先修课程”的属性,用来示某一门课程的先修课程,每门课程应可记录多于一门的先修课程。要求: 1) 修改结构的定义,应尽量避免数据冗余,建立必要的主键,外键。 2) 设计并插入必要的测试数据,完成以下查询: 列出有资格选修数据库课程的所有学生。(该学生已经选修过数据库课程的所有先修课,并达到合格成绩。) 注意:须设计每个查询的测试数据,并在查询之前用INSERT语句插入中。 提交作业形式: 1) 建立Student数据库的SQL脚本,插入所有数据项的SQL脚本(包括所有的测试数据)。 2) 完成查询要求的SQL语句脚本。 3) 选做题:须提交修改数据库定义的SQL脚本,插入测试数据的SQL脚本以及用于查询的SQL语句。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值