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

MySQL中约束是什么?

 🎉欢迎您来到我的MySQL基础复习专栏

☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克🍹
✨博客主页:小小恶斯法克的博客
🎈该系列文章专栏:重拾MySQL
🍹文章作者技术和水平很有限,如果文中出现错误,希望大家能指正🙏
📜 感谢大家的关注! ❤️

目录

📣约束是什么

📣演示如何约束

📣通过图形化界面创建表

📣外键约束

📣演示

 📣添加外键

📣删除外键

📣删除/更新行为

📣CASCADE (级联反应)

📣SET NULL


📣约束是什么

解释:约束是作用于表中字段上的规则,用于限制存储在表中的数据。

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

约束分类

约束

描述

关键字

非空约束

限制了 该字段的数据不能为null

not null

唯一约束

保证该字段的所有数据都是唯一、不重复的

unique

主键约束

主键是一行数据的唯一标识,要求非空且唯一

primary key

默认约束

保存数据时,如果未指定该字段的值,则采用默认值

default

检查约束

保证字段值满足某一个条件

check

外键约束

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

foreign key

✨唯一约束:比如身份证号,用户注册手机号,甚至用户名都可以用。

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

✨一旦谈到外键至少有两张表。


📣演示如何约束

根据需求,完成表结构的创建。需求如下:

字段名

字段含义

字段类型

约束条件

约束关键字

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)

对应的建表语句为:

约束用空格分开即可,不用写逗号 

注意我的版本为MySQL8.0.12,不能直接使用check约束,会报错 ,详细解决办法请参考我的文章如何解决MySQL报错 You have an error in your SQL syntax; check the manual that corresponds to your MySQL?-CSDN博客

create table user(id int auto_increment primary key comment 'ID唯一标识',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 '用户表' ; 

执行:

 在为字段添加约束时,我们只需要在字段之后加上约束的关键字即可,需要关注其语法。我们执行上面的SQL把表结构创建完成,然后接下来,就可以通过一组数据进行测试,从而验证一下,约束是否可以生效。

insert into user (name,age,status,gender) values ('Tom1',19,'1','男'),
('Tom2',25,'0','男');
insert into user (name,age,status,gender) values ('Tom3',19,'1','男'); 
insert into user (name,age,status,gender) values (null,19,'1','男');
insert into user (name,age,status,gender) values ('Tom3',19,'1','男'); 
insert into user (name,age,status,gender) values ('Tom4',80,'1','男');
insert into user (name,age,status,gender) values ('Tom5',-1,'1','男');
insert into user (name,age,status,gender) values ('Tom5',121,'1','男');
insert into user (name,age,gender) values ('Tom5',120,'男');

执行:(这里并没有一条一条测试,大概一眼就能知道运行那条语句会报错,这里举一个例子)

因为我们刚刚对姓名设置了约束不为空 ,所以报此条错误。且我们设置了name唯一,所以name相同也会报错

我们可以看到表中数据如下:

要特别注意一点!有人会问主键id不应该是自增的嘛,1,2,3,后面怎么是9,10。

原因是我们刚刚向数据库去插入数据虽然没有成功,但是已经向数据库申请到了4,5,6,7,8,所以下一次再申请就会从8往后申请,申请为9


📣通过图形化界面创建表


📣外键约束

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

举例:

员工表的部门id,dept_id,就是指定了当前员工属于哪个部门,但是里面仅仅存储了部门的id值,它关联的是另外一张部门表的主键,此时dept_id就是我们员工表的外键,它关联的就是部门表中的主键,通过外键让两张表的数据产生连接

此时我们把部门表称之为父表,员工表称之为子表,具有外键的表就称之为子表,外键所关联的这张表称为父表,有时候我们也叫这两个表主表或从表

注意:目前上述两张表,只是在逻辑上存在这样一层关系;在数据库层面,并未建立外键关联,  所以是无法保证数据的一致性和完整性的。意思就是假如说我们直接去删除了部门表的某一条数据,我们员工表的数据没有任何变化,因为目前这两个表在数据库层面没有建立任何关系,只有逻辑关系。如果我们把一号部门删了,此时大家会看到,对于员工表而言,2345员工都是属于一号部门的,部门都不在了,此时员工数据就出现了不完整


 📣演示

数据准备

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 empcp(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 empcp (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);

表一数据:

表二数据 :

部门表中删除id1的部门信息

员工表还关联着1号部门,此时出现数据不完整性

没有数据库外键关联的情况下,是无法保证数据的一致性和完整性的


 📣添加外键

两种方式添加外键,在创建表的时候就添加外键,或者表创建完成之后再去添加外键

CREATE TABLE 表名(字段名	数据类型...
[CONSTRAINT]	[外键名称] FOREIGN KEY (外键字段名)	REFERENCES	主表 (主表列名)
);ALTER	TABLE 表名	ADD  CONSTRAINT	外键名称	FOREIGN	KEY (外键字段名)
REFERENCES 主表 (主表列名) ;  --constraint翻译为限制,束缚;克制,拘束,在代码中也就是add增加一个约束

案例:

empcp表的dept_id字段添加外键约束,关联dept表的主键id

外键叫foreign key,所有我们简写fk

alter table empcp add constraint fk_empcp_dept_id foreign key (dept_id) references dept(id);   --references的英文意思是 附……以供参考;把……引作参考

添加了外键约束之后,我们再回去dept表(父表)删除id为1的记录,发现会报错,此时不能够删除,因为存在外键约束


📣删除外键

ALTER	TABLE 表名	DROP FOREIGN KEY 外键名称;

 案例:

删除empcp表的外键fk_empcp_dept_id

alter table empcp drop foreign key fk_empcp_dept_id;

执行:

此时没有外键约束,可以任意删除dept表数据了


📣删除/更新行为

添加了外键之后,再删除父表数据时产生的约束行为,我们就称为删除/更新行为。具体的删除/更新行  为有以下几种:

行为

说明

no action

当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不 允许删除/更新。 (RESTRICT 一致) 默认行为

restrict

当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不 允许删除/更新。 (NO ACTION 一致) 默认行为

cascade

当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。

set null

当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表 中该外键值为null(这就要求该外键允许取null)。

set default

父表有变更时,子表将外键列设置成一个默认的值 (Innodb不支持)

 语法:

前面部分都是添加外键的语法,我们只需要在后面再添加 on update 更新时干嘛干嘛,on delete 删除时干嘛干嘛,就行。例如级联就是ON UPDATE CASCADE ON DELETE CASCADE

ALTER TABLE 表名  ADD CONSTRAINT 外键名称  FOREIGN KEY (外键字段)	REFERENCES
主表名 (主表字段名)	ON UPDATE CASCADE ON DELETE CASCADE;

演示如下:

由于NO ACTION是默认行为,我们前面语法演示的时候,已经测试过了,就不再演示了,这里我们再演示其他的两种行为:CASCADESET NULL

📣CASCADE (级联反应)

确定好父表和子表之间还没有外键约束的时候我们去执行这个语句

alter table empcp add constraint fk_empcp_dept_id foreign key (dept_id) references
dept(id) on update cascade on delete cascade ;

​​​​​​​修改父表id1的记录,将id修改为6  (级联关联之后,我们可以去修改id,看看效果)

此时原来的id=6都变为了id=1,更新时,它也会更新外键在子表中的记录

如果把dept表中id为6的数据都删了呢,在子表empcp中会有什么变化?

当我删除父表当中的记录时,如果父表当中的数据在子表中存在外键关联,那么子表的数据也会删除


📣SET NULL

在进行测试之前,我们先需要删除上面建立的外键fk_empcp_dept_id。然后再通过数据脚本,将empcp、dept表的数据恢复了。因为这些准备没做好,我们执行外键约束是会报错的

alter table empcp add constraint fk_empcp_dept_id foreign key (dept_id) references
dept(id) on update set null on delete set null ;

接下来,我们删除id1的数据,看看会发生什么样的现象。

如下: 

我们发现父表的记录是可以正常的删除的,父表的数据删除之后,再打开子表 empcp,我们发现子表empcp的dept_id字段,原来dept_id1的数据,现在都被置为NULL了。这就是SET NULL这种删除/更新行为的效果。

相关文章:

MySQL中约束是什么?

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…...

若依在表格中如何将字典的键值转为中文

文章目录 一、需求&#xff1a;二、问题解决步骤1、给需要转换的列绑定formatter属性2、获取字典项3、编写formatter属性绑定的方法 一、需求&#xff1a; 后端有时候返回的是字典的键值&#xff0c;在前端展示时需要转成中文值 后端返回的是dictValue&#xff0c;现在要转换…...

用笨办法-刻意练习来提高自己的编程能力

尝试了很多学习方法&#xff0c;企图快速提高编程能力&#xff0c;但最终发现&#xff0c;唯有老老实实刻意练习1&#xff0c;在辛苦与时间积累下&#xff0c;逐渐提升能力&#xff0c;才是最有效的方式。 将自己的笨办法总结了一下&#xff0c;主要包含7个步骤&#xff1a; …...

FineBI报表页面大屏小屏自适应显示问题

大屏正常显示 显示正常 小屏BI自适应显示 存在遮挡字体情况 小屏浏览器缩放显示 等比缩放后显示正常...

NAND Separate Command Address (SCA) 接口命令解读

CA output packet和CA input packet是Separate Command Address (SCA) NAND接口协议中用于命令和地址传输的关键数据结构。 CA Input Packet: 在SCA接口中&#xff0c;输入到NAND器件的命令和地址信息被组织成并行至串行转换的CA&#xff08;Command and Address&#xff09;输…...

Git的简单使用说明

Git入门教程 git的最主要的作用&#xff1a;版本控制&#xff0c;协助开发 一.版本控制分类 ​​ 1.本地版本控制 ​​ 2.集中版本控制 ​​ 所有的版本数据都存在服务器上&#xff0c;用户的本地只有自己以前所同步的版本&#xff0c;如果不连网的话&#xff0c;用户就看不…...

少儿编程 2023年12月电子学会图形化编程等级考试Scratch二级真题解析(判断题)

2023年12月scratch编程等级考试二级真题 判断题(共10题,每题2分,共20分) 26、声音Medieval1的长度是9.68秒,运行下列程序1或程序2都能实现,播放声音2秒后,声音停止角色移动100步 答案:对 考点分析:考查积木综合使用,重点考查声音积木的使用 程序1中用的是等待播完…...

前端面试 -- vue系列

Vue系列 1. vue理解&#xff1a;2. SPA&#xff08;单页面应用理解&#xff09;3. vue实例挂载的过程4. v-for和v-if优先级5. SPA首屏加载速度慢的原因和解决办法6. Vue中给对象添加新属性界面不刷新&#xff08;直接给对象添加属性&#xff09;7. vue组件之间的通信方式有哪些…...

open3d相关操作总结

open3d其实有很多交互式命令&#xff0c;在运行程序打开了open3d渲染的窗口后&#xff0c;鼠标点击窗口&#xff0c;按H就会弹出&#xff0c;交互命令的帮助&#xff0c;如下图所示&#xff1a; 其中比较常用的有&#xff1a; Q &#xff1a;退出当前窗口 H&#xff1a;打印帮…...

HTTP数据请求

文章目录 1 概述2 什么是HTTP3 如何发起HTTP请求4 参考链接 1 概述 日常生活中我们使用应用程序看新闻、发送消息等&#xff0c;都需要连接到互联网&#xff0c;从服务端获取数据。例如&#xff0c;新闻应用可以从新闻服务器中获取最新的热点新闻&#xff0c;从而给用户打造更…...

孩子兄弟结构体【】

#include <stdio.h> typedef int TElemType; typedef struct CSTNode {TElemType data;struct CSTNode* firstChild;struct CSTNode* nextSibling; }CSTNode,*CSTree;...

SSM-SpringMVC+Spring+Mybatis

创建项目 创建好 项目后, 项目目录分析 数据库设计 我们采用员工表 Employee 与 部门表 Department 部门表 表设计--- 员工表 --表设计 因为有文件上传操作,因此 建立 info表 (其中 员工只能隶属一个部门,因此 两张表之间 有外键关系) java 代码 设计 数据库建立完毕后,需要…...

系统存储架构升级分享 | 京东云技术团队

一、业务背景 系统业务功能&#xff1a;系统内部进行数据处理及整合, 对外部系统提供结果数据的初始化(写)及查询数据结果服务。 系统网络架构: 部署架构对切量上线的影响 - 内部管理系统上线对其他系统的读业务无影响分布式缓存可进行单独扩容, 与存储及查询功能升级无关通过…...

OpenCV-22高斯滤波

一、高斯函数的基础 要理解高斯滤波首先要直到什么是高斯函数&#xff0c;高斯函数是符合高斯分布的&#xff08;也叫正态分布&#xff09;的数据的概率密度函数。 高斯函数的特点是以x轴某一点&#xff08;这一点称为均值&#xff09;为对称轴&#xff0c;越靠近中心数据发生…...

实现LCM在docker之间的通信

目录 1.docker容器互联 新建网络 连接容器 2.设置环境变量 3.在两个docker之间实现通信 1.docker容器互联 新建网络 $ docker network create -d bridge test-net 连接容器 运行一个容器并连接到新建的 test-net 网络: $ docker run -itd --name lcm_1 --network tes…...

GitLab任意用户密码重置漏洞(CVE-2023-7028)

GitLab CVE-2023-7028 POC user[email][]validemail.com&user[email][]attackeremail.com 本文链接&#xff1a; https://www.黑客.wang/wen/47.html...

在机械行业中,直线导轨和弧形导轨哪个应用范围更广泛?

弧形导轨和直线导轨是两种常见的导轨类型&#xff0c;直线导轨主要被用于高精度或快速直线往复运动场所&#xff0c;而弧形导轨是一种专门设计用于曲线运动的导轨系统&#xff0c;那么在机械行业中&#xff0c;直线导轨和弧形导轨哪个应用范围更加广泛呢&#xff1f; 直线导轨主…...

关于ue4 射击游戏架构设计

传统mmo的服务器架构 网关--->游戏逻辑服--->游戏db服 网关---> 游戏逻辑服--->关系服务器master 其结构简单&#xff0c;方便维护&#xff0c;但是在应对射击游戏时候暴露出很大的缺陷 但是随着大dau产品的像和平精英等游戏问世 腾讯主要的服务器是基于tbus4j…...

vc++开发地图

1、概述 &#xff08;1&#xff09;mapbox 官网&#xff1a;https://docs.mapbox.com/mapbox-gl-js/example/ github: https://github.com/mapbox/mapbox-gl-native (2)mapX 使用VC创建MapX控件步骤 在vc中作用mapx C 如何根据地理坐标范围获取瓦片地图并使用CImage库实现多张…...

轻量化的yolov8部署到安卓Android手机端

一、pytorch环境配置和yolov8源码安装 首先在电脑上需要配置好pytorch环境&#xff0c;和yolov8源码的下载 然后针对yolov8做自己的轻量化改进 二、下载Android Studio和ncnn-android-yolov8 1. Android Studio官网链接&#xff1a; 下载 Android Studio 和应用工具 - And…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

机器学习的数学基础:线性模型

线性模型 线性模型的基本形式为&#xff1a; f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法&#xff0c;得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...