一、表的完整性约束
为防止不符合规范的数据存入数据库,在用户对数据进行插入、修改、删除等操作时,MySQL提供了一种机制来检查数据库中的数据是否满足规定的条件,以保证数据库中数据的准确性和一致性,这种机制就是完整性约束。
MySQL中主要支持以下几种种完整性约束,如表所示。 其中Check约束是MySQL8中提供的支持。
二、非外键约束
1、主键约束和自增约束
主键约束是指,如果为一个字段添加主键约束,那么这个字段的值就可以唯一标识一段记录。自增约束是指,约束的字段的值会自动递增。主键约束和自增约束一般一起使用,常用在约束序号列。
自增约束(AUTO_INCREMENT)可以使表中某个字段的值自动增加。一张表中只能有一个自增长字段,并且该字段必须定义了约束(该约束可以是主键约束、唯一约束以及外键约束),如果自增字段没有定义约束,数据库则会提示“Incorrect table definition; there can be only one auto column and it must be defined as a key”错误。
由于自增约束会自动生成唯一的ID,所以自增约束通常会配合主键使用,并且只适用于整数类型。一般情况下,设置为自增约束字段的值会从1开始,每增加一条记录,该字段的值加1。
create table student(
stu_id int(10) primary key,
stu_name varchar(3),
stu_sex varchar (1)
);
/*为student表中的主键字段添加自增约束*/
alter table student11 modify stu_id int(10) auto_increment;
使用ALTER TABLE语句删除自增约束 :
alter table student modify stu_id int(10);
2、非空约束
约束的字段值不能为空。
3、唯一约束
添加了唯一约束的字段的值不可以重复。
4、检查约束
添加检查约束时,可以设置值的范围,不符合范围的值将不能被添加到数据库表中。
5、默认值约束
为字段添加默认值约束后,如果该字段没有传入值,则使用默认值。
三、非外键约束的分类
非外键约束从作用上可以分为两类:
- 表级约束:可以约束表中任意一个或多个字段。与列定义相互独立,不包含在列定义中;与定义用逗号分隔;必须指出要约束的列的名称;如:
constraint pk_stu primary key (sno) -- pk_stu 主键约束的名字
- 列级约束:包含在列定义中,直接跟在该列的其它定义之后 ,用空格分隔;不必指定列名;例如:
sno int(6) primary key auto_increment
1、使用列级约束建表,语法结构是:列名 列类型 约束名
创建包含学生数据的表时,为其添加各种非外键约束:
create table t_student(
sno int(6) primary key auto_increment, -- 自增约束+主键约束
sname varchar(5) not null, -- 非空约束
sex char(1) default '男' check(sex='男' || sex='女'), -- 检查约束+默认值约束
age int(3) check(18<=age<35),
enterdate date,
classname varchar(10),
email varchar(15) unique -- 唯一约束
);
2、使用表级约束建表,语法结构是:constraint 给本次约束起的名字 约束名 (字段名+条件)
创建包含学生数据的表时,为其添加各种非外键约束:
create table t_student(
sno int(6) auto_increment,
sname varchar(5) not null,
sex char(1) default '男',
age int(3),
enterdate date,
classname varchar(10),
email varchar(15),
constraint pk_stu primary key (sno), -- pk_stu 主键约束的名字
constraint ck_stu_sex check (sex = '男' || sex = '女'),
constraint ck_stu_age check (age >= 18 and age <= 50),
constraint uq_stu_email unique (email)
);
表级约束还有另外一种写法,就是在创建表以后通过SQL语句添加约束,例如:
alter table t_student add constraint pk_stu primary key (sno) ; -- 主键约束
alter table t_student modify sno int(6) auto_increment; -- 修改自增条件
alter table t_student add constraint ck_stu_sex check (sex = '男' || sex = '女');
alter table t_student add constraint ck_stu_age check (age >= 18 and age <= 50);
alter table t_student add constraint uq_stu_email unique (email);