当前位置: 首页 > news >正文

MySQL(四)——约束

上期文章

MySQL(三)——函数


文章目录

  • 上期文章
  • 概述
  • 约束演示
  • 外键约束
    • 添加外键
    • 删除外键
    • 删除/更新行为
  • 总结


概述

概念:作用于表中字段上的规则,用于限制存储在表中的数据
目的:保证数据库中数据的正确、有效性和完整性

分类

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

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

约束演示

在这里插入图片描述

create table user(id int primary key auto_increment comment '主键',name varchar(10) not null unique comment '姓名' ,age int check ( age > 0 and age <= 120 ) comment '年龄' ,status char(1) default '1' comment '状态' ,gender char(1) comment '性别'
)comment '用户表';insert into user(name,age,status,gender) values ('tom1',19,'1','男'),('tom2',25,'0','男');
insert into user(name,age,gender) values ('tom3',25,'男');

外键约束

让两张表的数据之间建立连接,从而保证数据的一致性和完整性

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

添加外键

/*添加外键*/
CREATE TABLE 表名(字段名 数据类型,...[CONSTRAINT] [外键名称] FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名)
);ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名);
create table dept(
id int auto_increment comment 'ID' primary key,
name varchar(50) not null comment '部门名称'
)comment '部门表';
INSERT INTO dept (id, name) VALUES (1, '研发部'), (2, '市场部'),(3, '财务部'), (4, '销售部'), (5, '总经办');create table emp(
id int auto_increment comment 'ID' primary key,
name varchar(50) not null comment '姓名',
age int comment '年龄',
job varchar(20) comment '职位',
salary int comment '薪资',
entrydate date comment '入职时间',
managerid int comment '直属领导ID',
dept_id int comment '部门ID'
)comment '员工表';
INSERT INTO emp (id, name, age, job,salary, entrydate, managerid, dept_id)
VALUES
(1, '金庸', 66, '总裁',20000, '2000-01-01', null,5),(2, '张无忌', 20, '项目经理',12500, '2005-12-05', 1,1),
(3, '杨逍', 33, '开发', 8400,'2000-11-03', 2,1),(4, '韦一笑', 48, '开 发',11000, '2002-02-05', 2,1),
(5, '常遇春', 43, '开发',10500, '2004-09-07', 3,1),(6, '小昭', 19, '程 序员鼓励师',6600, '2004-10-12', 2,1);alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id);

删除外键

/*删除外键*/
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
alter table emp drop foreign key fk_emp_dept_id;

删除/更新行为

行为说明
NO ACTION当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与RESTRICT一致)
RESTRICT当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与 NO ACTION一致)
CASCADE当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录
SET NULL当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(这就要求该外键允许取null)
SET DEFAULT父表有变更时,子表将外键列设置成一个默认的值(Innodb不支持)
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES 主表名(主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update cascade on delete cascade ;alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update set null on delete set null ;

总结

相关文章:

  • Python GUI 新手入门教程:轻松构建图形用户界面
  • [足式机器人]Part2 Dr. CAN学习笔记- Kalman Filter卡尔曼滤波器Ch05
  • 我用 ChatGPT 做了一次探索性数据分析,真的太太太实用了!
  • 【算法与数据结构】Java实现查找与排序
  • TPU编程竞赛系列|第八届集创赛“算能杯“报名开启!
  • 阿里云服务器配置选择之线下IDC直接映射
  • 【备战蓝桥杯】吃奶酪问题 / 超硬核,文附template拓展知识!
  • 位运算的规则(算法村第十一关青铜挑战)
  • ❤ Uniapp使用四( 高阶使用配置和各种实现篇)
  • 【CC++】为什么 scanf 函数在读取字符串时不需要用取地址运算符
  • git中合并分支时出现了代码冲突怎么办
  • 可狱可囚的爬虫系列课程 12:在网站中寻找 API 接口(补充)(王者荣耀英雄信息抓取)
  • 【AUTOSAR】RTE 接口类型、应用场景差别及实例讲解
  • docker使用指南疑难杂症
  • Flink启动Yarn Session报错:Couldn‘t deploy Yarn session cluster
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • hadoop集群管理系统搭建规划说明
  • nodejs调试方法
  • PHP 小技巧
  • React-Native - 收藏集 - 掘金
  • Spring-boot 启动时碰到的错误
  • v-if和v-for连用出现的问题
  • 对超线程几个不同角度的解释
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 普通函数和构造函数的区别
  • 如何选择开源的机器学习框架?
  • 数据结构java版之冒泡排序及优化
  • 微信小程序实战练习(仿五洲到家微信版)
  • 我的zsh配置, 2019最新方案
  • 新版博客前端前瞻
  • 06-01 点餐小程序前台界面搭建
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (C#)一个最简单的链表类
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (zhuan) 一些RL的文献(及笔记)
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • .Net mvc总结
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • @media screen 针对不同移动设备
  • @SuppressWarnings(unchecked)代码的作用
  • @synthesize和@dynamic分别有什么作用?
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛