目录

MySQL6-数据库约束

【MySQL】(6) 数据库约束

一、约束的作用

就是 自动对数据、表间关联关系的正确性校验 ,一般在列上加约束。

二、各种约束

1、非空约束 not null

限制数据值不能为 null,比如学生姓名:

https://i-blog.csdnimg.cn/direct/38cefe18b7b7483ab77ddc002b136756.png

2、唯一约束 unique

限制数据值唯一,比如 id:

https://i-blog.csdnimg.cn/direct/1b92489f183c4823998eee6f71c50ca6.png

但是 unique 限制的 id 可以有重复的 null:

https://i-blog.csdnimg.cn/direct/b8543c483ed34124b32d30c027ed957b.png

3、主键约束 primary key

限制数据唯一且不为空, 可以由一个或多个列组成 ,用于唯一标识数据行,建议每个表都有一个主键,但 一个表最多只能有一个主键最多只能有一个 auto_increment 列 ,主键类型建议为 bigint。

https://i-blog.csdnimg.cn/direct/5b315a3b23714f57873b43dd320f65af.png

插入数据:

https://i-blog.csdnimg.cn/direct/b0318a7f144348c78c09972624c52e61.png

https://i-blog.csdnimg.cn/direct/982487a68d1448dda4f21b14a9dca1c8.png

当插入失败时(比如设置 id 为重复值),插入失败的那个自增值会失效(auto_imcrement 只会增加,不会减少):

https://i-blog.csdnimg.cn/direct/ef42337f9f83440dbd3319657b987d3a.png

https://i-blog.csdnimg.cn/direct/e2c284b1c95e482694587c13b61497bd.png

当预计插入数据的主键、唯一键会有重复时,可以用以下两种语法(先把 name 设置为 unique):

https://i-blog.csdnimg.cn/direct/0ee083ecf2994feeaf927ccff8148dbc.png

语法1:主键、唯一键冲突,则 更新数据 ;不冲突,则直接插入(恢复到原样再执行):

https://i-blog.csdnimg.cn/direct/5146d86b46be4dd1811f2d3e7521c1b7.png

语法2:主键、唯一键冲突,则 删除数据,再添加 ;不冲突,则直接插入:

https://i-blog.csdnimg.cn/direct/3cf059cd4cbe42c4a4163ec5f598530c.png

在工作中是 不建议替换旧记录 的,应该先查询有没有冲突,没有就插入。有就做更新操作,要么把旧记录的 deleteState 设为 1,再添加新记录。

修改 (id, name) 为一个主键:

https://i-blog.csdnimg.cn/direct/52bef4b75b1847c9b3aa0630a77ec9b2.png

primary key 和 not null + unique 是不一样的。primary key 是表的属性,一个表只能有一个主键;而 not null + unique 是业务数据的要求,一个表中的很多数据都可以是 not null + unique 。

4、外键约束 foreign key

外键约束 定义了主表和从表之间的关系外键约束定义在从表 中,从表 引用的主表列必须是主键或唯一键 。当从表中的外键约束列添加值时, 只能从主表的引用列中的值选择,或者为 null

语法:

https://i-blog.csdnimg.cn/direct/5ec27804e0d74571bcb514ec9b7db71c.png

创建班级表和学生表:

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)  # 外键约束
);

查看表结构:

https://i-blog.csdnimg.cn/direct/1a30dba53d5743ddbb876e2fccf4e553.png

插入一个不存在的班级编号的学生信息:

https://i-blog.csdnimg.cn/direct/0bc0b7d2464f47d7808e213b8d5c0750.png

如果从表引用了主表中的列值,主表就不能随意删除该列值,或者删除主表。如果非要删除,从表必须删除引用的值,或者删除外键约束:

https://i-blog.csdnimg.cn/direct/053536d4c27a417ca0d61663465ac29b.png

外键约束影响数据库效率,数据量很大时,在 java 程序中处理关联关系,校验好后再入库。

5、默认约束 default

就是给列一个默认值,插入数据时,若 没有给该列指定值,则给默认值 。如果 给了指定值,不管是 null 还是不是 null,都以设置的值为准

https://i-blog.csdnimg.cn/direct/e0b4229ac6d04a25abaf4ef658996cc8.png

6、check 约束

就是对数据值限定一个范围,8.0.16 版本后才起作用,check 约束也会像外键约束一样自动设置一个 check 约束名。语法如下:

https://i-blog.csdnimg.cn/direct/8b080d3ec4ad4959a0472cfd2e38ae23.png

因为很多老版本 MySQL 不支持 check,所以把校验放在 java 程序中。

常用的就是非空、唯一、主键、默认约束 ,外键约束在大公司不用,check 约束不用。