全部章节   >>>>

本章目录

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章 表结构管理】_mysql

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

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

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

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

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

MySQL数据操作与查询笔记 • 【第2章 表结构管理】_mysql_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章 表结构管理】_字符串_08

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

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

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

 

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

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

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

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

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

2.3.3 域完整性

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

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

 

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

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

 

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

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

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

2.4 参照完整性约束

2.4.1 外键

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

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

2.4.2 参照完整性定义

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

参照完整性的目的:

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

参照完整性相关术语:

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

MySQL数据操作与查询笔记 • 【第2章 表结构管理】_mysql_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章 表结构管理】_mysql_14

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

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

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

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

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

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

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

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