MySQL6-数据库约束
【MySQL】(6) 数据库约束
一、约束的作用
就是 自动对数据、表间关联关系的正确性校验 ,一般在列上加约束。
二、各种约束
1、非空约束 not null
限制数据值不能为 null,比如学生姓名:
2、唯一约束 unique
限制数据值唯一,比如 id:
但是 unique 限制的 id 可以有重复的 null:
3、主键约束 primary key
限制数据唯一且不为空, 可以由一个或多个列组成 ,用于唯一标识数据行,建议每个表都有一个主键,但 一个表最多只能有一个主键 , 最多只能有一个 auto_increment 列 ,主键类型建议为 bigint。
插入数据:
当插入失败时(比如设置 id 为重复值),插入失败的那个自增值会失效(auto_imcrement 只会增加,不会减少):
当预计插入数据的主键、唯一键会有重复时,可以用以下两种语法(先把 name 设置为 unique):
语法1:主键、唯一键冲突,则 更新数据 ;不冲突,则直接插入(恢复到原样再执行):
语法2:主键、唯一键冲突,则 删除数据,再添加 ;不冲突,则直接插入:
在工作中是 不建议替换旧记录 的,应该先查询有没有冲突,没有就插入。有就做更新操作,要么把旧记录的 deleteState 设为 1,再添加新记录。
修改 (id, name) 为一个主键:
primary key 和 not null + unique 是不一样的。primary key 是表的属性,一个表只能有一个主键;而 not null + unique 是业务数据的要求,一个表中的很多数据都可以是 not null + unique 。
4、外键约束 foreign key
外键约束 定义了主表和从表之间的关系 。 外键约束定义在从表 中,从表 引用的主表列必须是主键或唯一键 。当从表中的外键约束列添加值时, 只能从主表的引用列中的值选择,或者为 null 。
语法:
创建班级表和学生表:
drop table if exists class;
create table class (
id bigint primary key auto_increment,
name varchar(20) not null
);
insert into class (name) values ('java01'), ('java02'), ('java03'), ('C++01'), ('C++02');
drop table if exists student;
create table student(
id bigint PRIMARY KEY auto_increment,
name varchar(20) not null,
age int DEFAULT 18,
class_id bigint,
foreign key (class_id) references class(id) # 外键约束
);
查看表结构:
插入一个不存在的班级编号的学生信息:
如果从表引用了主表中的列值,主表就不能随意删除该列值,或者删除主表。如果非要删除,从表必须删除引用的值,或者删除外键约束:
外键约束影响数据库效率,数据量很大时,在 java 程序中处理关联关系,校验好后再入库。
5、默认约束 default
就是给列一个默认值,插入数据时,若 没有给该列指定值,则给默认值 。如果 给了指定值,不管是 null 还是不是 null,都以设置的值为准 。
6、check 约束
就是对数据值限定一个范围,8.0.16 版本后才起作用,check 约束也会像外键约束一样自动设置一个 check 约束名。语法如下:
因为很多老版本 MySQL 不支持 check,所以把校验放在 java 程序中。
常用的就是非空、唯一、主键、默认约束 ,外键约束在大公司不用,check 约束不用。