(一)什么是完整性约束?

为了防止步符合规范的数据存入数据库,在用户对数据进行增删改操作时,MySQL提供一种机制来检查数据库中的数据是否满足规定的条件,确保数据的准确性和一致性。


(二)MySQL支持的完整性约束

在这里插入图片描述


(三)列级约束

列级约束:创建表时添加约束

1
2
3
4
5
6
7
8
9
10
11
-- 创建stu_info表
CREATE TABLE stu_info (
`s_id` int(10) PRIMARY KEY AUTO_INCREMENT,
`s_name` varchar(10) NOT NULL,
`s_sex` char(1) default '男' CHECK(s_sex = '男' or s_sex = '女'),
`s_age` int(3) CHECK(s_age > 18 and s_age < 100),
`s_born_date` date ,
`classname` varchar(10),
`score` double(5,1),
`s_tel` int(11) UNIQUE
);

在这里插入图片描述
在这里插入图片描述
s_id 主键非空唯一 若设置自动增长(可以 不填/NULL/default)
s_name 非空约束
s_sex 男/女约束
s_age >18 and < 100约束
s_tel 唯一约束

注意:当主键设置了自动增长AUTO_INCREMENT并且插入数据产生错误时,数据没有插进去,但是主键已经自增,出现不连号现象(允许的)


(四)表级约束

表级约束在建表时,在最后一个字段后使用 constraint限制,格式如下

1
2
3
4
5
6
7
8
9
-- 创建表
create table 表名
(
...,
-- 表级约束
constraint 自定义约束名 约束 (字段名),
...
);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE stu_info (
`s_id` int(10) AUTO_INCREMENT,
`s_name` varchar(10) NOT NULL,
`s_sex` char(1) default '男' ,
`s_age` int(3) ,
`s_born_date` date ,
`classname` varchar(10),
`score` double(5,1),
`s_tel` int(11),
-- 表级约束
constraint pk_s_id primary key (s_id),
constraint sex_check CHECK(s_sex = '男' or s_sex = '女'),
constraint age_check CHECK(s_age > 18 and s_age < 100),
constraint s_tel_unique UNIQUE (s_tel)
);

注意:

  • 自增约束前提时主键约束
  • auto_increment、not null、default只能使用列级约束
  • 表级约束的优点就是当插入不合法的数据时,就会报错自定义的约束名,方便查错误

(五)已存在的表添加约束

  • 一般:
    alter table 表名 add constraint 自定义约束名 约束类型;

  • 特殊:对于想给主键增加auto_increment约束(只能使用列级约束)
    alter table 表名 modify 字段名 类型 auto_increment;

对已创建的stu_info表添加约束

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
-- 创建stu_info表
CREATE TABLE stu_info (
`s_id` int(10) ,
`s_name` varchar(10) ,
`s_sex` char(1) ,
`s_age` int(3) ,
`s_born_date` date ,
`classname` varchar(10),
`score` double(5,1),
`s_tel` int(11)
);

-- 对已创建的表添加表级约束
alter table stu_info add CONSTRAINT pk_s_id primary key (s_id);
alter table stu_info add CONSTRAINT sex_check CHECK(s_sex = '男' or s_sex = '女');
alter table stu_info add CONSTRAINT age_check CHECK(s_age > 18 and s_age < 100);
alter table stu_info add CONSTRAINT s_tel_unique UNIQUE (s_tel);


-- 对已创建的表添加列级约束
alter table stu_info modify s_id int(10) AUTO_INCREMENT;
alter table stu_info modify s_name varchar(10) NOT NULL;
alter table stu_info modify s_sex char(1) default '男';

-- 查看表结构
desc stu_info;

-- 删除表
drop table stu_info;

  • 图形化操作:添加约束
    在这里插入图片描述
    在这里插入图片描述