​​全部章节   >>>>​​


​本章目录​

2.1 关系模型与数据表

2.1.1 关系模型

2.1.2 数据表

2.2 MySQL 数据类型

2.2.1 MySQL 常见数据类型

2.2.2 使用 Navicat for MySQL 创建数据表结构

2.3 数据完整性约束

2.3.1 数据完整性

2.3.2 实体完整性约束

2.3.3 域完整性

2.4 参照完整性约束

2.4.1 外键

2.4.2 参照完整性定义

2.4.3 设置外键约束实现参照完整性

总结:


2.1 关系模型与数据表

2.1.1 关系模型

关系模型是由若干个关系模式组成的集合,关系模式的实例称为关系,每个关系实际上是一张二维表格。

关系模型用键导航数据,其表格简单。


订单号



客户 ID



下单时间



订单金额



订单状态



DD201805200001



C10001



2018-5-2019:20:03



322.5



商品出库



DD201805220001



C10003



2018-5-229:13:20



530



物流揽收



DD201805220002



C10002



2018-5-2214:42:31



123.56



发往目的地



DD201805260002



C10001



2018-5-2610:13:25



210.2



客户签收


关系数据库是以关系模型为基础的数据库,是一种根据表、元组(记录)以及字段(列)之间的关系进行组织和访问数据的数据库,其通过若干个表来存取数据,并且通过关系将这些表联系在一起。

关系模型中的术语:


  • 关系(Relation)对应通常所说的一张表,如订单表。
  • 元组(Tuple)表中的一行即为一个元组,它可以标识实体集中的一个实体,元组亦可称作“记录(Record)”。表中任意两行(元组)不能相同。
  • 属性(Attribute)表中的一列即为一个属性,给每个属性起一个名称即属性名,属性亦可称作列(Column),表中的属性名(列名)不能相同,每个属性都有值。
  • 主键(Key)表中的某个属性组,它可以唯一确定一个元组,属性组可以有一个或多个属性。
  • 关系模式:对关系的描述,可表示为关系名。

2.1.2 数据表

对于关系型数据库而言,一张表就是一个关系

在数据库中,数据表是数据存储的基本单位,是数据库中最重要、 最基本的操作对象。

数据表被定义为列的集合, 数据在表中是按照行和列的格式来存储的。

每一行代表一条唯一的记录,每一列代表记录中的一个域。

2.2 MySQL 数据类型

2.2.1 MySQL 常见数据类型


类型分类



类型



取值范围或描述



示例



整数类型



tinyint



0 ~255



员工年龄:32



smallint



-32768~32767



员工数:2540



int



-2147483648~2147483647



中国人口数:1354040000



小数类型



decimal



decimal(5,2)表示小数的取值范围是-999.99~999.99



商品单价:892.35



定长字符串类型



char



char(10) 表示字符串存储 10 个字符,即便该字符串只有一个字符, 它所占用的存储空间也是 10 个字符空间大小



公司名:HUAWEI



变长字符串类型



varchar



varchar(10) 表示字符串最多存储10 个字符,如果该字符串仅包含一个字“中”,那么它所占用的存储空间也只是一个字符空间大小。定义 varchar 类型可节省存储空间



公司地址:武汉洪山区珞瑜路 546 路光谷科技会展中心



类型分类



类型



取值范围或描述



示例



日期类型



date



格式:YYYY-MM-DD(年 - 月- 日)取值范围:1000-01-01 ~ 9999-12-31



出生日期:1982-03-24



日期类型



time



格式:HH:MM:SS(时 : 分钟 : 秒)取值范围:-838:59:59 ~ 838:59:59

注意:时间不限当天



早晨上班时间:08:30:00



datetime



格式:YYYY-MM-DD HH:MM:SS

取 值 范 围:1000-01-01 00:00:00 ~ 9999-12-31 23:59:59



登 机 时 间:2015-05-1214:35:0


2.2.2 使用 Navicat for MySQL 创建数据表结构

数据库 bus 中公交线路表line


线路号



所属分公司



起点站



终点站



线路长度(km)



车辆数



502



公交六公司



黄州街 108 街坊



桥口码头



23.7



15



503



公交二公司



文馨街文昌街口



沿江大道青岛路口



22.5



20



541



公交三公司



江盛路长江紫都



长丰大道东风村



27.3



17



605



公交三公司



古田二路翠堤春晓



梨园广场



24.4



16



607



公交四公司



园林路钢都花园



玉龙路朱家亭



28.2



19



609



公交五公司



沿河大道桥口码头



南湖公交场站



18.2



14



620



公交二公司



康居五路



汉黄路岱家山



16.2



12


线路表表结构


字段名









lineNo



线路号



varchar



10



company



所属分公司



varchar



20



from_station



起点站



varchar



20



to_station



终点站



varchar



20



miles



线路长度



decimal(3,1)





number



车辆数



smallint





线路号虽然显示为数字,但不宜采用数字类型,只能是字符串类型。因为线路号与身份证号类似,不仅有一定的编码规则,还可能出现字母。


利用 Navicat for MySQL 创建表

MySQL数据操作与查询笔记 • 【第2章 表结构管理】_java

MySQL数据操作与查询笔记 • 【第2章 表结构管理】_数据库_02

MySQL数据操作与查询笔记 • 【第2章 表结构管理】_java_03

使用 Navicat for MySQL 维护数据表结构

MySQL数据操作与查询笔记 • 【第2章 表结构管理】_java_04

MySQL数据操作与查询笔记 • 【第2章 表结构管理】_sql_05

MySQL数据操作与查询笔记 • 【第2章 表结构管理】_数据库_06

2.3 数据完整性约束

2.3.1 数据完整性

为了防止不符合规范的数据进入数据库,在用户对数据进行插入、修改以及删除等操作时,DBMS 自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数据库中存储的数据正确、有效、相容。

数据完整性用于保证数据库中的数据在逻辑上的一致性、正确性和可靠性。

数据完整性主要包含:​实体完整性​、​域完整性​和​参照完整性​。

2.3.2 实体完整性约束

实体完整性规定表的每一行记录在表中是唯一的

实体完整性主要包含​主键约束​和​唯一约束​。


主键约束(Primary Key Constraint)用于唯一识别每一条记录,数据表中具有唯一值的字段可设定为主键字段。

主键选择策略:工程实践所推荐的做法是:新增一个无业务含义的字段作为主键,该字段为整数类型,且字段值自动增长。

线路表主键选择:在线路表中新增一个 int 类型的字段“线路编号(lineID)”,将该字段设置为主键且自动增长。当“线路编号”设置为自动增长时,则每次新增线路的“线路编号”值将从 1 开始,且每次递增 1。


在线路表中设置主键和主键自增长的具体做法如下:


  1. 新增字段“线路编号(lineID)”,设置该字段为 smallint 类型。
  2. 选中字段“lineID”,单击“MySQL数据操作与查询笔记 • 【第2章 表结构管理】_java_07 ”,即设置“lineID”为主键,并勾选“自动递增”。

MySQL数据操作与查询笔记 • 【第2章 表结构管理】_sql_08


每个数据表只能有一个主键。设定为主键的字段内容不能有重复值,且不能为 null 值。


唯一约束(Unique Constraint):如果某个字段满足唯一性约束要求,则可以向该字段添加唯一性约束。

与主键约束相比,唯一约束也用于确保列中不存在重复值,但其列值可以是 null。


在线路表的“lineNo”上设置唯一约束:

MySQL数据操作与查询笔记 • 【第2章 表结构管理】_sql_09

MySQL数据操作与查询笔记 • 【第2章 表结构管理】_java_10

MySQL数据操作与查询笔记 • 【第2章 表结构管理】_java_11


主键约束要求列值非空,而唯一键约束允许列值为空。


2.3.3 域完整性

域完整性指给定列输入的有效性,即保证指定列的数据具有正确的数据类型、格式和有效的数据范围。

域完整性主要包含​非空约束​、​默认值约束​。


非空约束(Not Null Constraint):如果某个字段满足非空约束的要求,则应该在字段上设置非空约束。

示例:​在线路表“所属公司”设置非空约束,只需在线路表设计窗口中选中“company”,取消勾选“允许空值”即可。


默认值约束(Default Constraint):如果某个字段满足默认值约束的要求,可向该字段添加默认值约束。

示例:​在“company”列上设置默认值约束,默认值为“公交二公司”。

MySQL数据操作与查询笔记 • 【第2章 表结构管理】_sql_12

2.4 参照完整性约束

2.4.1 外键

在公交管理系统中规定营运车辆都隶属于某个具体的公交线路。因此应在车辆表设计一个字段,该字段与线路表的主键 lineID 的数据类型和长度大小应完全一致,并且值也参照线路表中的主键值。

这种参照其他表中主键的字段称为外键。

2.4.2 参照完整性定义

参照完整性是指通过定义一张表中外键与另一张表中主键之间的引用规则来约束这两张表之间的联系。

参照完整性的目的:

  • 利用关联表之间的制约机制互相参照,控制表间数据的一致性和完整性。这种制约机制会在用户执行插入、修改或删除记录等编辑记录的操作时,发挥其限制作用。参照完整性有效地限制了对表中数据的非法编辑,参照完整性的实质就是不允许在相关数据表中引用那些不存在的记录。

参照完整性相关术语:


  • 从表:含有外键且参照其他表的表,如车辆表。从表亦称作“子表”或“参照表”。
  • 主表:被其他表参照的表,如线路表。主表亦称作“父表”或“被参照表”。
  • 外键:从表中的参照列称为外键,外键名与被参照的主表中的主键数据类型应完全一致,但可以不同名。如车辆表中的字段“线路”。
  • 被参照列:主表中的被参照列通常为主表的主键(也可以为唯一键)。如表的主键 lineID 为被参照列。

MySQL数据操作与查询笔记 • 【第2章 表结构管理】_数据库_13


(1)参照完整性实现方法:通过定义外键与主键之间的对应关系来实现。

(2)参照完整性作用:保证从表中数据与主表中数据的一致性。当增加、修改或删除数据表中的记录时,可以借助参照完整性来保证相关联表之间数据的一致性。


2.4.3 设置外键约束实现参照完整性

公交车辆表 vehicle 的表结构:


 字段名



说明



类型



长度



约束



 vehicleID



车辆编号



int





主键、自动增长



 plateNo



车牌号



varchar



10



非空



 model



型号



varchar



20





 type



类型



varchar



20



普通车、空调车



 lineID



线路编号



int





外键,参照 line 表


使用 Navicat for MySQL 在 vehicle 表的 lineID 上设置外键

MySQL数据操作与查询笔记 • 【第2章 表结构管理】_数据库_14

MySQL数据操作与查询笔记 • 【第2章 表结构管理】_字符串_15

MySQL数据操作与查询笔记 • 【第2章 表结构管理】_sql_16

MySQL数据操作与查询笔记 • 【第2章 表结构管理】_sql_17

MySQL数据操作与查询笔记 • 【第2章 表结构管理】_mysql_18

MySQL数据操作与查询笔记 • 【第2章 表结构管理】_java_19

测试添加从表数据一致性问题

MySQL数据操作与查询笔记 • 【第2章 表结构管理】_java_20

总结:


  • 数据完整性确保数据库中存储的数据正确、有效和相容。
  • 数据完整性包括实体完整性、域完整性和参照完整性。
  • 实体完整性约束包括主键约束和唯一约束。
  • 域完整性约束包括非空约束和默认值约束。
  • 参照完整性是指通过定义一张表中外键与另一张表中主键之间的引用规则来约束这两张表之间的联系。
  • 参照其他表主键或唯一约束列的字段称为外键,外键用于实现参照完整性。包含外键的表称为从表或子表。