【MySQL学习笔记007】约束

1、概述

(1)概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。

(2)目的:保证数据库中数据的正确、有效性和完整性。

(3)分类

|------|------------------------------|-------------|
| 约束 | 描述 | 关键字 |
| 非空约束 | 限制该字段的数据不能为null | NOT NULL |
| 唯一约束 | 保证该字段的所有数据都是唯一、不重复的 | UNIQUE |
| 主键约束 | 主键是一行数据的唯一标识,要求非空且唯一 | PRIMARY KEY |
| 默认约束 | 保证数据时,如果未指定该字段的值,则采用默认值 | DEFAULT |
| 检查约束 | 保证字段值满足某一个条件 | CHECK |
| 外键约束 | 用来让两张表的数据之间建立连接,保证数据的一致性和完整性 | FOREIGN KEY |

注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。

2、约束演示

(1)案例

|--------|--------|-------------|---------------|-----------------------------|
| 字段名 | 字段含义 | 字段类型 | 约束条件 | 约束关键字 |
| id | ID唯一标识 | int | 主键,并且自动增长 | primary key, auto_increment |
| name | 姓名 | varchar(10) | 不为空,并且唯一 | Not null, unique |
| age | 年龄 | int | 大于0,并且小于等120 | check |
| status | 状态 | char(1) | 如果没有指定该值,默认为1 | default |
| gender | 性别 | char(1) | 无 | |

(2)实现

sql 复制代码
create table user(
    id int primary key auto_increment comment '主键',
    name varchar(10) not null unique comment '姓名',
    age int check ( age > 0 && age <= 120 ) comment '年龄',
    status char(1) default '1' comment '状态',
    gender char(1) comment '性别'
) comment '用户表';

-- 插入数据
-- 主键原则,id自动延长
insert into user(name, age, status, gender) values ('Tom1', 19, '1', '男'), ('Tom2', 25, '0', '男');

insert into user(name, age, status, gender) values ('Tom3', 32, '3', '女');

-- name not null
insert into user(name, age, status, gender) values (null, 32, '3', '女');
# [23000][1048] Column 'name' cannot be null
-- name unique
insert into user(name, age, status, gender) values ('Tom3', 32, '3', '女');
# [23000][1062] Duplicate entry 'Tom3' for key 'user.name'

-- age check >0 <=120
insert into user(name, age, status, gender) values ('Tom4', 40, '3', '女');
# 此时主键id变为5,这是因为刚刚的操作已经像数据库申请了id=4的主键,因此此时id为5
insert into user(name, age, status, gender) values ('Tom5', -1, '3', '女');
# [HY000][3819] Check constraint 'user_chk_1' is violated.
insert into user(name, age, status, gender) values ('Tom5', 121, '3', '女');
# [HY000][3819] Check constraint 'user_chk_1' is violated.

-- status default '1'
insert into user(name, age, gender) values ('Tom5', 120, '女');
# 成功插入

3、外键约束

概念:外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性

注意: 目前上述的两张表,在数据库层面,并未建立外键关联,所以是无法保证数据的一致性和完整性的

(1)添加外键

语法

sql 复制代码
alter table 表名 add constraint 外键名称 foreign key (外键字段名) references 主表(主表列名)

(2) 删除外键

语法

sql 复制代码
alter table 表名 drop foreign key 外键名称

(3)删除/更新行为

|-------------|----------------------------------------------------------------|
| 行为 | 说明 |
| NO ACTION | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与RESTRICT一致) |
| RESTRICT | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与NO ACTION一致) |
| CASCADE | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则删除/更新外键在子表中的记录 |
| SET NULL | 当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为NULL(这就要求该外键允许取null) |
| SET DEFAULT | 父表有变更时,子表将外键列设置成一个默认的值(Innodb不支持) |

语法

sql 复制代码
alter table 表名 add constraint 外键名称 foreign key (外键字段) references 主表名(主表字段名) on update cascade on delete cascade
相关推荐
小陈phd7 分钟前
TensorRT 入门完全指南(一)——从核心定义到生态工具全解析
人工智能·笔记
是上好佳佳佳呀14 分钟前
【前端(十一)】JavaScript 语法基础笔记(多语言对比)
前端·javascript·笔记
qeen8718 分钟前
【数据结构】建堆的时间复杂度讨论与TOP-K问题
c语言·数据结构·c++·学习·
handler0137 分钟前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法
@小柯555m1 小时前
MySql(高级操作符--操作符混合运用)
数据库·sql·mysql
lizhihai_991 小时前
股市学习心得-六张分时保命图
大数据·人工智能·学习
其实防守也摸鱼1 小时前
CTF密码学综合教学指南--第四章
网络·笔记·安全·网络安全·密码学·ctf
nashane1 小时前
HarmonyOS 6学习:应用签名文件丢失处理与更新完全指南
学习·华为·harmonyos·harmonyos 5
@codercjw1 小时前
公差的具体标注方法(书本上/理论上标注方法)
学习
向風而行2 小时前
MySQL详解
数据库·mysql