目录
一、实验目的与要求
1、掌握MySQL中如何创建数据库和表的方法(要求在交互式命令提示符下完成,截图)
2、熟练掌握MySQL的数据类型、主键实体完整性的设置
3、参照完整性的定义及应用(Navicat可视化操作,熟悉代码)
4、插入数据(Navicat完成)
5、数据库的备份操作
二、实验内容
1、创建数据库
创建名为fruitshop的数据库,并创建数据表fruits、customers(客户)、orderitems(订单详单)、suppliers(供货商)和orders(订单总表),表结构和约束条件如下:
注:
1.各表中的“字段说明”属性仅用于辅助说明该属性的含义,不用定义在表的结构中
2.表中没有明确指定外键,试分析找出各表中的外键并定义其外键约束、级联删除、级联更新操作;
字段名 | 字段说明 | 数据类型 | 主键 | 外键 | 非空 | 唯一 | 自增 |
f_id | 水果编号 | char(10) | Y | N | Y | Y | N |
s_id | 供应商编号 | INT | N | Y | Y | N | N |
f_name | 水果名 | char(255) | N | N | Y | N | N |
f_price | 价格 | decimal(8,2) | N | N | Y | N | N |
字段名 | 字段说明 | 数据类型 | 主键 | 外键 | 非空 | 唯一 | 自增 |
c_id | 客户编号 | int | Y | N | Y | Y | Y |
c_name | 客户名 | char(50) | N | N | Y | N | N |
c_address | 客户地址 | char(50) | N | N | N | N | N |
c_city | 城市 | char(50) | N | N | N | N | N |
c_zip | 邮编 | char(10) | N | N | N | N | N |
c_contact | 联系人 | char(50) | N | N | N | N | N |
c_email | 电子邮箱 | char(255) | N | N | N | N | N |
字段名 | 字段说明 | 数据类型 | 主键 | 外键 | 非空 | 唯一 | 自增 |
o_num | 订单号 | int | Y | Y | Y | N | N |
o_item | 订单项 | int | Y | N | Y | N | N |
f_id | 水果编号 | char(10) | N | Y | Y | N | N |
quantity | 数量 | int | N | N | Y | N | N |
item_price | 单价 | decimal(8,2) | N | N | Y | N | N |
注:orderitems表中o_num和o_item的组合构成主键。
字段名 | 字段说明 | 数据类型 | 主键 | 外键 | 非空 | 唯一 | 自增 |
s_id | 供应商编号 | int | Y | N | Y | Y | Y |
s_name | 供应商名 | char(50) | N | N | Y | N | N |
s_city | 城市 | char(50) | N | N | N | N | N |
s_zip | 邮编 | char(10) | N | N | N | N | N |
s_call | 电话 | char(50) | N | N | Y | N | N |
字段名 | 字段说明 | 数据类型 | 主键 | 外键 | 非空 | 唯一 | 自增 |
o_num | 订单号 | int | Y | N | Y | Y | Y |
o_date | 订购日期 | datetime | N | N | Y | N | N |
c_id | 客户编号 | int | N | Y | Y | N | N |
源码:
创建数据库:
创建表:
①创建fruits表:
②创建customers表:
③创建orderitems表:
④创建suppliers表:
⑤创建orders表:
运行测试结果截图:
①命令行数据库创建成功
②创建suppliers表成功
③创建customers表成功
④创建fruit表成功
⑤创建orders表成功
⑥创建orderitems表成功
⑦各表创建成功后,显示表格成功
2、插入数据
向数据表fruits、customers、orderitems和suppliers、orders中插入给定的如下数据,要求如下:向数据表customers和suppliers中分别插入一条记录,新记录customers的C_ID属性值统一为10000,在suppliers的S_ID属性值统一为100,S_NAME数据为JMU,其余属性值为本人的真实信息;向数据表fruits、orderitems、orders表中插入分别插入五条与本人相关(即在对应表中的C_ID属性为10000,S_ID属性为100)的新记录
源码:
运行测试结果截图:
①Navicat插入新记录成功
②插入新记录后各表显示
3、完成本次实验数据库的备份操作
方法一:Mysql -uroot -p123456 数据库名 >目的地址及文件名.sql
方法一:Navicate Premium转储为.sql
比较上述两种方法的异同:
①方法一是用在命令行下进行,在目的文件地址输入正确的前提下可以快速导出sql文件,但是存在命令行警告提示,这样操作暴露密码是不安全的。
②方法二是在Navicat下进行的转储
首先,选择目标数据库;
再者,右键点击,选择转储SQL文件,再选择结构和数据;
然后,选择存储位置保存。
三、实验小结
1.实验中遇到的问题及解决过程
① 问题:不清楚decimal数据类型
解决:decimal(a,b)的参数说明:
a指定指定小数点左边和右边可以存储的十进制数字的最大个数,默认是10,最大精度65。b指定小数点右边可以存储的十进制数字的最大个数。小数位数必须是从 0 到 a之间的值。默认小数位数是 0,最大值为30。DECIMAL数据类型用于要求非常高的精确度的计算中,这些类型允许指定数值的精确度和计数方法作为选择参数。精确度在这里是指为这个值保存的有效数字的总个数,而计数方法表示小数点后数字的个数。例如,语句DECIMAL (5,2)规定了存储的值将不会超过5位数字,开且小数点后面有2位数字。
② 问题:不清楚datetime数据类型
解决:datetime为日期类型,所能存储的时间范围为:'1000-01-01 00:00:00.000000' 到 '9999-12-31 23:59:59.999999'。字节为8,格 式为YYYY-MM-DD HH:MM:SS,用于保存同时包含日期和时间两部分的值。
2. 实验中产生的错误及原因分析
① 错误:无法添加外键约束的
原因分析:fruit表有s_id的外码,fruit表是参照表,suppliers表是被参照表;创建fruit表的时候,未创建suppliers表,所以根据参照完整性的定义,产生错误,拒绝创建fruit表。
② 错误:SQL语法错误
原因分析:第五行多了一个逗号,导致错误
③ 错误:Navicat插入数据报错,报错语句如下:
INSERT INTO `orderitems` VALUES (001, 2, 'F005', 12, 6.6)
> 1452 - Cannot add or update a child row: a foreign key constraint fails
(`fruitshop`.`orderitems`, CONSTRAINT `orderitems_ibfk_1` FOREIGN KEY
(`o_num`) REFERENCES `orders` (`o_num`))
原因分析:向orderitems表插入新纪录时,外码错误;此时还未向fruit表中添加新纪录,fruit表为空,即主码无f_id,而先向orderitems表中的外码f_id,根据参照完整性的定义,产生错误。
3. 实验体会和收获
本次实验旨在用命令行和Navicat对数据库进行创建和插入操作,熟悉了两种方式对数据库备份。实践操作中,因为有两次过程中遇到的错误,使我认识到了老师上课所讲到的参照完整性,对此有更加清楚深刻的了解;同时也学习到了mysql的数据类型比如decimal和datetime,上了八周理论课,确确实实在实验课上操作起来更加有刻板印象。