2.1 数据的完整性
数据的完整性是指数据的精确性( Accuracy )和可靠性( Reliability )。
2.2 数据完整性的目的
目的是为了防止数据完整数据库中存在不符合语义规定的数据或者因错误信息的输入而造成无效的操作。
2.3 数据的完整性分为4类:
实体完整性( Entity Integrity )域完整性( Domain Integrity )、引用完整性( Referential Integrity )和用户自定义完整性( User - defined Integrity )。
2.3.1 实体完整性
实体就是数据库中所要表示的客观世界中存在的事物。
实体完整性在表中的约束体现为:主键( Primary Key )约束、唯一( unique )约束。
Primary Key:主键是表中一列或多列数据,用来唯一标识一行数据。例如:学号
Unique :可以用来确保在非主键列中不存在重复值,列值可以是 NULL (空)
2.3.2域完整性
域完整性的约束:外键( Foreign key )约束、默认值( Default )约束、非空( Not Null )约束。
FOREIGN KEY (外键)约束:一个表中的 FOREIGN KEY 指向另一个表中的主键
DEFAULT (默认值)约束:用于向列中插入默认值
NOT NULL (非空)约束:用于强制该列不许为 NULL (空)
2.3.3引用完整性
引用完整性是基于外键与主键之间的关系。 MySQL 中的引用完整性是通过外键( FOREIGN KEY )约束来实现的。
2.3.4自定义完整性
用户自定义完整性是指针对某一具体关系型数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。
2.4 数据完整性在 MySQL 中的体现
2.4.1使用主键约束
主键约束( PRIMARY KEY CONSTRAINT )要求主键列的唯一,并且不允许为空。
在 MySQL 中主键分为:单字段主键和多字段主键。
(1)设置单字段为主键
在 MySQL 中由一个字段做为主键时,分为两种情况。
(2)在定义列的同时 置主键,语法规则如下:
列名数据类型 PRIMARY KEY [默认值]
A .在定义完成所有列之后设置主键,语法规则如下:
[ CONSTRAINT 约束名] PRIMARY KEY (列名)
(3)设置多个字段为主键(设置联合主键):
PRIMARY KEY ([列名1,列名2,列名3,...,列名 N ])
2.4.2 设置字段为自动增长
可以通过为主键设置 AUTO _ INCREMENT 关键字来实现。 在设置 AUTO _ INCREMENT 时需要遵守以下几点规则:
(1)一个表中只能有一个字段使用 AUTO _ INCREMENT 。
(2) AUTO _ INCREMENT 必须做为主键的一个部分(只有主键可以设置),不得单独使用。
(3) AUTO _ INCREMENT 字段的数据类型必须为整数类型。
设置表的字段为自动增长的语法:
列名数据类型 AUTO _ INCREMENT PRIMARY KEY
2.4.3 使用外键约束
一个表中可以有零到任意多个外键。
外键约束中有两个名词,需要大家注意。
(1)主表(父表):对于两个具有关系的表而言,相关联的字段中主键所在表即为主表。
(2)从表(子表):对于两个具有关系的表而言,相关联的字段中外键所在表即为从表。
创建外键的语法如下:
[ CONSTRAINT 外键名] FOREIGN KEY 字段名1[,字段名2,...]
REFERENCES 主表名主键列1[,主键列2,...]
2.4.4 使用非空约束
非空约束( Not Null constraint )指字段的值不能为空。
建表时设置非空约束的语法:
字段名数据类型 not null
2.4.5 使用默认约束
默认约束指定某列的默认值。
建表时设置默认值约束的语法如下:
字段名数据类型 default 默认值
注意:
默认值只能约束一个列,不能在多个列上做约束,不能用于 AUTO _ INCREMENT 列、 TIMESTAMP 列,如果对一个已经有数据的添加默认约束,原来的数据不能得到默认值。
2.4.6 使用唯一约束
唯一( UNIQUE )约束:要求该列的值唯一,允许为空,但是只能出现一个空值。唯一约束可以确保一列或者多列不出现重复值。
唯一约束的语法规则如下:
字段名数据类型 UNIQUE
2.5 数据规范化
第一范式( INF ):字段值具有原子性,不能再分(所有关系型数据库系统都满足第一范式);
例如:姓名字段,其中姓和名是一个整体,如果区分姓和名那么必须设立两个独立字段;
第二范式(2NF):一个表必须有主键,即每行数据都能被唯一的区分;
备注:必须先满足第一范式;
第三范式(3NF):一个表中不能包涵其他相关表中非关键字段的信息,即数据表不能有沉余字段;
备注:必须先满足第二范式;
数据库的三范式:
①字段不可分。
②有主键,非主键字段依赖主键。
③非主键字段不能互相依赖。
备注:往往我们在设计表中不能遵守第三范式,因为合理的沉余字段将会给我们减少 join 的查询;
例如:相册表中会添加图片的点击数字段,在相册图片表中也会添加图片的点击数字段;