为防止不符合规范的数据存入数据库,在用户对数据进行插入、修改、删除等操作时,MySQL提供了一 种机制来检查数据库中的数据是否满足规定的条件,以保证数据库中数据的准确性和一致性,这种机制就是完整性约束。
MySQL中主要支持以下几种完整性约束,如表所示。其中Check约束时MySQL8中提供的支持。
约束条件 约束描述
primary key 主键约束,约束字段的值可唯一地标识对应的记录
not null 非空约束,约束字段的值不能为空
unique 唯一约束,约束字段的值是唯一的
check 检查约束,限制某个字段的取值范围
default 默认约束值,结束字段的默认值
auto_increment 自动增加约束,约束字段的值自动递增
foreign key 外键约束,约束表与表之间的关系
实例操作:
/* 建立一张用来存储学生信息的表 字段包含学号、姓名、性别,年龄、入学日期、班级,email等信息
约束:
建立一张用来存储学生信息的表 字段包含学号、姓名、性别,年龄、入学日期、班级,email等信息
[1]学号是【主键】=不能为空+唯一,主键的作用:可以通过主键查到唯一 的一条记录
[2]如果主键是整数类型,那么需要自增
[3]姓名不能为空
[4]Email唯一
[5]性别默认值是男
[6]性别只能是男女
[7]年龄只能在18-50之间 */
-- 创建数据库表:
create table t_student(
sno int(8) primary key auto_increment,
-- primary key 就是加一个主键约束
-- auto_increment 就是一个自增约束
sname varchar(4) not null,
sex char(2) default '男' check(sex='男' || sex='女'),
-- default是默认的
-- check 检查约束 只能是男或女
age int(3) check(age>=18 and age<=50),
enterdate date,
classname varchar(10),
email varchar(15) unique -- unique是唯一的
);
-- 查看数据:
select *from t_student;
-- 添加数据:
insert into t_student values (1,'张三','男',18,now(),'计科二班','123@123.com');
-- 错误提示:
-- 1048 - Column 'sname' cannot be null 不能为null
-- 1062 - Duplicate entry '2' for key 'PRIMARY' 主键重复冲突了
-- 3819 - Check constraint 't_ student_chk_ 1' is violated. 违反检查约束
-- 1062 - Duplicate entry '123@123.com' for key 'email'
-- 1062 - Duplicate entry '456@123.com' for key 'email' 邮箱重复了,违反了唯一约束
insert into t_student values (2,'李四','男',90,now(),'计科二班','456@123.com');
insert into t_student values (3,'王五','男',20,now(),'计科二班','789@123.com');
update t_student set sex ='女' where sno = 1;
insert into t_student (sno,sname,sex) values (4,'马六','男'); -- 插入部分内容
insert into t_student (sname,age,enterdate) values ('赵七',22,now());
-- sno默认递增一位,sex默认为男,完成了约束
insert into t_student values (null,'王八','男',20,now(),'计科二班','987@123.com');
insert into t_student values (default,'唐九','男',20,now(),'计科二班','654@123.com');
-- 如果主键没有设定值,用null和default都不影响主键自增的效果
insert into t_student values (null,'张三','男',18,now(),'计科二班','321@123.com');
-- 如果sql报错,可能主键就浪费了,后续插入的主键是不连号的,主键也不要求必须是连号的