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这种删除/更新行为的效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/315007.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MetaGPT前期准备与快速上手

大家好&#xff0c;MetaGPT 是基于大型语言模型&#xff08;LLMs&#xff09;的多智能体协作框架&#xff0c;GitHub star数量已经达到31.3k。 接下来我们聊一下快速上手 这里写目录标题 一、环境搭建1.python 环境2. MetaGpt 下载 二、MetaGPT配置1.调用 ChatGPT API 服务2.简…

写在学习webkit过程的前面

webkit起源于KHTML&#xff0c;是KDE开源项目的KHTML和KJS引擎的一部分。在它的诞生和发展过程中&#xff0c;由两家著名的公司参与开发过程中&#xff0c;造成两次裂变。诞生两个内核webkit和blink&#xff0c;并发展和产生了两个主流的浏览器&#xff0c;分别为safari和chrom…

全网快递查询工具:批量查询,提升工作效率的利器

在快递行业日新月异的今天&#xff0c;高效、准确的快递信息管理显得尤为重要。固乔快递查询助手正是一款专为快递网点设计的实用工具&#xff0c;它可以帮助您快速、批量查询全网快递单号&#xff0c;为您的网点运营带来诸多便利。 一、固乔快递查询助手的用途 批量查询&…

跨境商城系统如何开发代购商城、国际物流、一件代发等功能?

跨境商城系统的开发涉及到多个方面&#xff0c;其中代购商城、国际物流和一件代发等功能是其中的重要组成部分。本文将详细介绍如何开发这些功能&#xff0c;以帮助跨境商城系统更好地满足市场需求。 一、代购商城的开发 代购商城是跨境商城系统中的重要功能之一&#xff0c;它…

FilterQuery过滤查询

ES中的查询操作分为两种&#xff1a;查询和过滤。查询即是之前提到的query查询&#xff0c;它默认会计算每个返回文档的得分&#xff0c;然后根据得分排序。而过滤只会筛选出符合条件的文档&#xff0c;并不计算得分&#xff0c;并且可以缓冲记录。所以我们在大范围筛选数据时&…

阅读笔记lv.1

阅读笔记 sql中各种 count结论不同存储引擎计算方式区别count() 类型 责任链模式常见场景例子&#xff08;闯关游戏&#xff09; sql中各种 count 结论 innodb count(*) ≈ count(1) > count(主键id) > count(普通索引列) > count(未加索引列)myisam 有专门字段记录…

Python 全栈体系【四阶】(十二)

第四章 机器学习 十五、朴素贝叶斯 朴素贝叶斯是一组功能强大且易于训练的分类器&#xff0c;它使用贝叶斯定理来确定给定一组条件的结果的概率&#xff0c;“朴素”的含义是指所给定的条件都能独立存在和发生。朴素贝叶斯是多用途分类器&#xff0c;能在很多不同的情景下找到…

leetcode17 电话号码的字母组合

方法1 if-else方法 if-else方法的思路及其简单粗暴&#xff0c;如下图所示&#xff0c;以数字234为例&#xff0c;数字2所对应的字母是abc&#xff0c;数字3所对应的是def&#xff0c;数字4所对应的是ghi&#xff0c;最后所产生的结果就类似于我们中学所学过的树状图一样&…

跟着cherno手搓游戏引擎【4】窗口抽象、GLFW配置

引入GLFW&#xff1a; 在vendor里创建GLFW文件夹&#xff1a; 在github上下载&#xff0c;把包下载到GLFW包下。 GitHub - TheCherno/glfw: A multi-platform library for OpenGL, OpenGL ES, Vulkan, window and input修改SRC/premake5.lua的配置&#xff1a;12、13、15、36…

异地快速传输大文件的常用方法

在企业间的信息沟通与协作中&#xff0c;快速传输大文件是一项基本需求。然而&#xff0c;跨地域传输庞大文件时&#xff0c;往往面临着网络带宽、文件大小、传输速度以及数据安全等多方面的挑战。本文将介绍四种常用的异地快速传输大文件的方法&#xff0c;并分析它们的优缺点…

数据结构学习之顺序栈应用的案例(有效的括号)

实例要求&#xff1a; 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效&#xff1b; 有效字符串需满足的条件&#xff1a; 1、左括号必须用相同类型的右括号闭合&#xff1b; 2、左括号必须…

robot_sim配置

robot_sim https://github.com/Suyixiu/robot_sim 的issue https://www.bilibili.com/video/BV19f4y1h73E/ 下评论 文件来源 其余克隆 基于几何的抓取 banana不显示 解决参考 https://github.com/Suyixiu/robot_sim/issues/2 &#xff08;项目配置主要参考&#xff09; …

LabVIEW在动态力传感器校准技术的创新应用

简介 动态力传感器校准装置集成了冲击法原理和自动化控制&#xff0c;实现精准、高效的传感器校验。LabVIEW的图形化界面提供简便操作和实时数据分析&#xff0c;显著提高了校准过程的准确度和效率。 01 系统设计和功能 动态力传感器在工业生产中发挥着重要作用&#xff0c;…

完整的模型验证套路

读取图片 from PIL import Imageimg_path "../Yennefer_of_Vengerberg.jpg" image Image.open(img_path) print(image)转换成灰度图&#xff08;可选&#xff09; image image.convert(L) image.show()转换成RGB格式 image image.convert(RGB)因为png格式是四…

软件测试|MySQL SHOW DATABASES详解

简介 在MySQL中&#xff0c;SHOW DATABASES是一条SQL语句&#xff0c;用于显示当前MySQL服务器上所有可用的数据库。这条简单而常用的命令可以让你快速查看服务器上的数据库列表。本文将详细介绍SHOW DATABASES的使用方法以及相关注意事项。 语法 在 MySQL 中&#xff0c;可…

Linux系统——DNS解析详解

目录 一、DNS域名解析 1.DNS的作用 2.域名的组成 2.1域名层级结构关系特点 2.2域名空间构成 2.3域名的四种不同类型 2.3.1延伸 2.3.2总结 3.DNS域名解析过程 3.1递归查询 3.2迭代查询 3.3一次DNS解析的过程 4.DNS系统类型 4.1缓存域名服务器 4.2主域名服务器 4…

pytorch学习笔记(七 )

池化类似压缩 最大池化-上采样 例如给一个3的话就会生成一个33的窗口&#xff08;生成相同的高和宽&#xff09;&#xff0c;给一个tuple就会给出一个相同的池化核。stride默认值就是核的大小 dilation 在卷积dialation设置之后每一个会和另外的差一个&#xff0c;空洞卷积 …

微信小程序——调节手机屏幕亮度案例分享

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

C++核心编程——类和对象(二)

本专栏记录C学习过程包括C基础以及数据结构和算法&#xff0c;其中第一部分计划时间一个月&#xff0c;主要跟着黑马视频教程&#xff0c;学习路线如下&#xff0c;不定时更新&#xff0c;欢迎关注。 当前章节处于&#xff1a; ---------第1阶段-C基础入门 ---------第2阶段实战…

代码随想录算法训练营第六天|哈希表理论基础,242.有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和

刷题建议 刷题建议与debug 代码随想录目前基本都有了视频讲解&#xff0c;一定要先看视频&#xff0c;事半功倍。写博客&#xff0c;将自己的感悟沉淀下来&#xff0c;不然会忘大家提问的时候&#xff0c;记得要把问题描述清楚&#xff0c;自己在哪一步遇到了问题&#xff0c…
最新文章