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.hqwc.cn/news/343282.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智慧厂区烟火识别系统应用

在当今的智能制造行业中&#xff0c;安全管理已成为优先考虑的重要议题。集度汽车公司在其实验室场区引入了一项创新技术——富维图像厂区烟火识别系统。这个项目的核心是利用先进的烟火识别系统&#xff0c;保障厂区的安全与稳定运行。 系统特点 烟火识别系统的准确率高和误报…

地理信息(gis)专业的同学,毕业后都做了什么工作?

总结&#xff1a;能转码的就转码&#xff0c;不能转码也得往开发靠。 但是没有对比&#xff0c;哪来最优选&#xff1f; 下面给大家分享下GIS职业发展路线&#xff0c;让你对你的职业规划有所启发&#xff0c;走出属于自己的路。 更详细的岗位分类和说明&#xff0c;在这个表…

【IDEA--dubug相关】-- 1. 取消debug的所有断点 2. debug侧边栏消失问题

下面是一些经常在日常debug时用到的场景&#xff0c;方便查看、与君共勉&#xff01; 文章目录 1. 如何取消所有断点2. debug底部左边侧边栏消失 1. 如何取消所有断点 如图我们可能在项目中给很多代码行添加了断点&#xff0c;一个一个点取消麻烦 在debug运行中点击选中底部…

开源Bluespec bsc编译器和可重用示例设计

这篇介绍Bluespec以及设计示例的文章&#xff0c;是在2021年ICCAD&#xff08;International Conference On Computer-Aided Design&#xff09;发布的论文。达坦科技的open-rdma项目和推广的MIT体系结构学习社区都用到Bluespec&#xff0c;因此将此论文翻译成中文&#xff0c;…

数谷·企声|贵州空港智能科技:以“智”提“质”,助力贵阳智慧机场建设

当前&#xff0c;我国民航正大力推进“平安、绿色、智慧、人文”的四型机场建设。贵州空港智能科技有限公司&#xff08;下称“空港智能科技”&#xff09;作为贵州民航产业集团有限公司&#xff08;下称“民航产业集团”&#xff09;信息化建设的排头兵和主力军&#xff0c;近…

软件测试|selenium 元素无法选择异常的原因及解决

简介 在进行 Web 自动化测试时&#xff0c;使用 Selenium 可能会遇到各种异常情况。其中之一就是 ElementNotSelectableException 异常&#xff0c;该异常通常意味着在尝试选择一个不可选元素时出现了问题。本文将详细介绍这个异常的原因、可能的解决方法&#xff0c;并提供示…

用友U8 BI数据可视化报表怎么做?秘籍在这!

首先要找到一款顺利对接用友U8的BI数据可视化分析工具&#xff0c;简称BI工具、BI软件。这款BI工具需符合以下要求&#xff1a; 1、能对接用友U8系统。 2、有专门根据用友系统特性量身打造的标准化BI方案&#xff0c;也就是有标准化的用友U8 BI方案。 3、数据可视化图表丰富…

蓝桥杯基础知识3 memset()

蓝桥杯基础知识3 memset() #include <bits/stdc.h> using namespace std;int main(){int a[5]; //随机数for(int i 0;i < 5; i)cout << a[i] << \n;cout << \n;memset(a, 0, sizeof a); //0for(int i 0;i < 5; i)cout << a[i] << …

【Jmeter之get请求传递的值为JSON体实践】

Jmeter之get请求传递的值为JSON体实践 get请求的常见传参方式 1、在URL地址后面拼接&#xff0c;有多个key和value时&#xff0c;用&链接 2、在Parameters里面加上key和value 第一次遇到value的值不是字符串也不是整型&#xff0c;我尝试把json放到value里面&#xff0…

[oeasy]python0004_游乐场_和python一起玩耍_python解释器_数学运算

和python玩耍 &#x1f94a; Python 回忆 上次 了解shell环境中的命令 命令作用whoami显示当前用户名pwd显示当前文件夹ls列出当前文件夹下的内容python3仿佛进入大于号黑洞 这python3 怎么玩啊&#xff01;&#x1f620; 说好的python教程呢&#xff1f;&#x1f914; 运…

如何在网络爬虫中解决CAPTCHA?使用Python进行网络爬虫

网络爬虫是从网站提取数据的重要方法。然而&#xff0c;在进行网络爬虫时&#xff0c;常常会遇到一个障碍&#xff0c;那就是CAPTCHA&#xff08;全自动公共图灵测试以区分计算机和人类&#xff09;。本文将介绍在网络爬虫中解决CAPTCHA的最佳方法&#xff0c;并重点介绍CapSol…

性能测试分析案例-定位服务吞吐量下降

环境准备 预先安装 docker、curl、wrk、perf、FlameGraph 等工具 sudo yum groupinstall Development Tools # 安装火焰图工具 git clone https://github.com/brendangregg/FlameGraph # 安装wrk git clone https://github.com/wg/wrk cd wrk && make && sud…