#冲刺创作新星#《MySQL入门很轻松》第5章:数据完整性及其分类 原创
1.数据完整性分类
数据库不仅要能存储数据,它也必须能够保证所保存的数据的正确性,为此MySQL 为用户提高了完整性约束条件。
数据完整性可分为实体完整性、域完整性和引用完整性,下面进行详细介绍。
(1) 实体完整性:指通过表中字段或字段组合将表中各记录的唯一性区别开来。例如,在学生表中,学生之间可能姓名相同,班级编号相同,但是每个学生的学号必然不同。实体完整
性的实施方法是添加 PRIMARY KEY 约束和 UNIQUE 约束。
(2)域完整性:指表中特定字段的值是有效取值。虽然每个字段都有数据类型,但实际并非满足该数据类型的值即为有效,应合乎情理。例如,学生的出生日期不可能晚于录入数据当天的日期天的日期。域完整性的实施方法是添加 CHECK约束和 DEFAULT 约束。
(3)引用完整性:数据库中的表和表之间的字段值是有联系的,甚至表自身的字段值也是有联系的,其中一个表中的某个字段值不但要符合其数据类型,而且必须是引用另一个表中某个字段现有的值。在输入或删除数据记录时,这种引用关系也不能被破坏,这就是引用完整性,它的作用是确保在所有表中具有相同意义的字段值一致,不能引用不存在的值。引用完整性的实施方法是添加PRIMARY KEY 约束。
2. 数据表的约束条件
在数据表中添加约束条件归根到底就是要确保数据的准确性和一致性,即表内的数据不相互矛盾,表之间的数据不相矛盾,关联性不被破坏。为此,可以从以下几个方面检查数据表的完整性约束。
(1)对列的控制,包括主键约束(PRIMARY KEY)、唯一性约束(UNIQUE) ;
(2)对列数据的控制,包括检查约束(CHECK)、默认值约束(DEFAULT)、非空约束(NOT NULL);
(3)对表之间及列之间关系的控制,包括外键约束(FOREIGN KEY)。满足完整性约束要求的数据必须具有以下3个特点。
(1)数据值正确无误:首先数据类型必须正确,其次数据的值必须处于正确的范围内。例如,“成绩”表中“成绩”字段的值必须大于或等于0小于或等于100。
(2)数据的存储必须确保同一表格数据之间的和谐关系。例如,“成绩”表中的“学号”字段列中的每一个学号对应一个学生,不可能将其学号对应多个学生。
(3)数据的存储必须确保维护不同表之间的和谐关系。例如,在“成绩”表中的“课程编号”列对应“课程”表中的“课程编号”列;在“课程”表中的“教师编号”列对应“教师”表中的“教师编号”列。
3. 主键约束
主键,又称主码,是表中一列或多列的组合。主键约束(Primary Key Constraint)要求主键列的数据唯一,并且不允许为空。主键和记录之间的关系如同身份证和人之间的关系,它们之间是一一对应的。主键分为两种类型:单字段和多字段联合主键。
3.1 创建表时添加主键
如果主键包含一个字段,则所有记录的该字段值不能相同或为空值;如果主键包含多个字段,则所有记录的该字段值的组合不能相同,而单个字段值可以相同,一个表中只能有一个主键,也就是说只能有一个 PRIMARY KEY 约束。
注意:数据类型为IMAGE和 TEXT的字段列不能定义为主键。
创建表时创建主键的方法是在数据列的后面直接添加关键字PRIMARY KEY,语法格式如下:
字段名 数据类型 PRIMARY KEY
主要参数介绍如下。
字段名:表示要添加主键约束的字段。
数据类型:表示字段的数据类型。
PRIMARY KEY:麦示所添加约束的类型为主键约束。
假如,要在酒店客户管理系统的数据库company中创建一个数据表用于保存房间信息,并给房间编号添加主键约束,表的字段名和数据类型如下表所示。
编 号 | 字段名 | 数据类型 | 说明 |
1 | Roomid | INT | 房间编号 |
2 | Roomtype | VARCHAR(20) | 房间类型 |
3 | Roomprice | FLOAT | 房间价格 |
4 | Roomfloor | INT | 所在楼层 |
5 | Roomface | VARCHAR(10) | 房间朝向 |
在数据库中定义Roominfo,为Roomid创建主键约束
create table Roominfo --创建Roominfo数据表
(
Roomid int primary key, --定义房间编号
Roomtype varchar(20), --定义房间类型
Roomprice float, --定义房间价格
Roomfloor int, --定义房间所在楼层
Roomface varchar(20) --定义房间朝向
);
在hotel数据库中定义数据表Roominfo_01,为Roommid创建主键约束
SQL语句如下:
create table Roominfo_01 --创建Roominfo_01数据表
(
Roomid int, --定义房间编号
Roomtype varchar(20), --定义房间类型
Roomprice float, --定义房间价格
Roomfloor int, 定义房间所在楼层
Roomface varchar(20) --定义房间朝向
primary key(Roomid) --定义房间编号为主键约束
);
3.2 修改表时添加主键
数据表创建完成后,如果还需要为数据表创建主键约束,此时不需要再重新创建数据表。可以使用 Alter语句为现有表添加主键。使用 ALTER 语句在现有数据表中创建主键,语法格式如下:
ALTERTABLE table name
ADD CONSTRAINT 约束名 PRIMARY KEY (column_namel,column_name2,…)
主要参数介绍如下。
CONSTRAINT:创建约束的关键字。
约束名:设置主键约束的名称。
PRIMARY KEY:表示所添加约束的类型为主键约束。
- 举例说明
在Hotel数据库中定义数据表Roominfo_02,创建完成之后,在该表中的Roomid字段上创建主键约束。输入以下 SQL 语句:
CREATE TABLE Roominfo_02 --创建Roominfo_02数据表
(
--定义房间编号
Roomid int NOT NULL, --定义房间类型
Roomtype varchar(20), --定义房间价格
Roomprice float, --定义所在楼层
Roomfloor int, --定义所在楼层
Roomface varchar(10) --定义房间朝向
);
下面给Roomid字段添加主键,输入SOL语句:
ALTER TABLE Roominfo_02ADD
CONSTRAINT 编号
PRIMARY KEY (Roomid);
单击“执行”按钮,即可完成创建主键的操作,如图所示。执行完成之后
使用“DESC Roominfo_02;”语句查看表结构,执行结果如图所示。从结果可以看出 Roomid字段上设置了主键约束。
3.3 创建联合主键约束
在数据表中,可以定义多个字段为联合主键约束,如果对多字段定义了PRIMARY KEY 约束,则一列中的值可能会重复,但来自 PRIMARYKEY 约束定义中所有列的任何值组合必须唯一。语法格式如下:
PRIMARY KEY[字段1,字段2,…,字段n]
主要参数介绍如下:
PRIMARY KEY:表示所添加约束的类型为主键约束。
字段n:表示要添加主键的多个字段。
举例说明
在 Hotel 数据库中,定义客户信息数据表userinfo,假设表中没有主键id,为了唯一确定一个客户信息,可以把name、tel联合起来作为主键。输入的SQL语句如下:
CREATE TABLE userinfo --创建userinfo数据表
(
name varchar(20), --定义客户名称
sex tinyint, --定义客户性别
age int, --定义客户年龄
tel varchar (10), --定义客户联系方式
Roomid int, --定义客户入住房间
CONSTRAINT 姓名联系方式
PRIMARY KEY (name , tel)
);
单击“执行”按钮,即可完成数据表的创建以及联合主键约束的添加操作,如图所示。执行完成之后,使用“DESC userinfo;,”语句查看表结构,执行结果如图5-10所示,从结果可以看出name字段和 tel字段组合在一起成为userinfo的多字段联合主键
3.4 删除表中的主键
当表中不需要指定PRIMARY KEY 约束时,可以使用 DROP语句将其删除。通过 DROP语句删除PRIMARY KEY 约束的语法格式如下:
ALTER TABLE table_name DROP PRIMARY KEY;
主要参数介绍如下:
table_name:要删除的主键约束的表名
PRIMARY KEY:主键约束关键字。
举例说明
在company数据库中,删除Roominfo表中定义的王键。SQL 语句:
ALTER TABLE Roominfo
DROPPRIMARY KEY;
单击“执行”按钮,即可完成删除主键的操作,如图所示。执行完成之后,使用“DESC Roominfo;”语句查看表结构,执行结果如图所示,从结果可以看出该数据表中的主键已经被删除。