MSQL 数据完整性(约束)
0. 前言
1. 实体完整性
- 1.1 主键约束(primary key)
- 1.2 唯一约束(unique)
- 1.3 自动增长列(auto_increment)
2. 域完整性
- 数据类型
- 非空约束
- 默认值约束
3. 引用完整性
4. 表间的映射关系
0. 前言
什么是数据完整性:保证用户输入的数据能正确地保存到数据库中。
如何确保数据完整性:在创建表时给表中添加约束。
完整性的分类:
- 实体完整性
- 域完整性
- 引用完整性
1. 实体完整性
什么是实体:表中的一行(一条记录)代表一个实体(entity)。
实体完整性的作用:标识每一行数据不重复。
约束类型:
- 主键约束(primary key)
- 唯一约束(unique)
- 自动增长列(auto_increment)
每个表可以有多个 UNIQUE 约束,但只能有一个 PRIMARY KEY 约束。
1.1 主键约束(primary key)
特点:数据唯一,且不能为 null。
-- 第一种添加方式 CREATE TABLE student_1( id int primary key, name varchar(50) ); -- 第二种添加方式:此种方式优势在于可以创建联合主键 CREATE TABLE student_2_1( id int, name varchar(50), primary key(id) ); CREATE TABLE student_2_2( classid int, stuid int, name varchar(50), primary key(classid,stuid) ); -- 第三种添加方式 CREATE TABLE student_3( id int, name varchar(50) ); ALTER TABLE student ADD PRIMARY KEY (id);
1.2 唯一约束(unique)
特点:数据不能重复。
CREATE TABLE student( id int primary key, name varchar(50) unique );
1.3 自动增长列(auto_increment)
-- 给主键添加自动增长的数值,列只能是整数类型,且必须配合主键使用 CREATE TABLE student( Id int primary key auto_increment, Name varchar(50) ); INSERT INTO student(name) values('tom');
2. 域完整性
域代表当前单元格。
域完整性的作用:限制此单元格的数据正确,不对照此列的其它单元格比较。
域完整性的约束分类:
- 数据类型
- 非空约束(not null)
- 默认值约束(default)
- check 约束(mysql 不支持):check(sex=’男’ or sex=’女’)
数据类型
非空约束(not null)
CREATE TABLE student( Id int pirmary key, Name varchar(50) not null, Sex varchar(10) ); INSERT INTO student values(1, 'tom', null);
默认值约束(default)
CREATE TABLE student( Id int pirmary key, Name varchar(50) not null, Sex varchar(10) default '男' ); insert into student1 values(1, 'tom', '女'); insert into student1 values(2, 'jerry', default);
insert into student1 values(3, 'peter');
3. 引用完整性(外键约束)
在设置外键(FOREIGN KEY)约束的情况下,插入表 2 的外键字段值必需要求在表 1 的主键字段值中能找到。
同时,假设要删除表 1 的某个主键字段值,那么必须保证表 2 中的外键字段没有该主键字段的值,否则就没法删除。
-- 创建表1 CREATE TABLE student( sid int pirmary key, name varchar(50) not null, sex varchar(10) default '男' ); -- 创建表2 -- 第一种添加外键方式 create table score( id int, score int, sid int , -- 外键列的数据类型一定要与主表主键的类型一致 CONSTRAINT fk_score_sid foreign key (sid) references student(id) ); -- 第二种添加外键方式 ALTER TABLE score ADD CONSTRAINT fk_stu_score FOREIGN KEY(sid) REFERENCES stu(id);
4. 表间的映射关系
示例:
一对一
例如 t_person 表和 t_card 表,即人和身份证。这种情况需要找出主从关系,即谁是主表,谁是从表。人可以没有身份证,但身份证必须要有人才行,所以 t_person 是主表,而 t_card 是从表。
设计从表可以有两种方案:
- 在 t_card 表中添加外键列(相对 t_person 表),并且给外键添加唯一约束;
- 给 t_card 表的主键添加外键约束(相对 t_person 表),即 t_card 表的主键也是外键。
一对多(多对一)
最为常见的就是一对多。一对多和多对一,取决于哪个角度去看的,一般都是在多方的那张表创建外键。
多对多
例如 t_stu 和 t_teacher 表,即一个学生可以有多个老师,而一个老师也可以有多个学生。这种情况通常需要创建中间表来处理多对多关系,例如可以再创建一张表 t_stu_tea 表,给出两个外键,一个是相对 t_stu 表的外键,另一个是相对 t_teacher 表的外键。