MySQL基础-----约束

目录

前言

一、概述

二、约束演示

三、外键约束

1.介绍

2.语法

 四、删除/更新行为

1.CASCADE

2.SET NULL


前言

        本期我们开始MySQL约束的学习,约束一般是只数据键对本条数据的约束,通过约束我们可以保证数据库中数据的正确、有效性和完整性。 下面就一起来看看吧。

一、概述

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

约束

描述

关键字

非空约束

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

NOT NULL

唯一约束

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

UNIQUE

主键约束

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

PRIMARY

KEY

默认约束

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

DEFAULT

检查约束(8.0.16版本之后)

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

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)

 

对应的建表语句为:
CREATE TABLE tb_user(
id int AUTO_INCREMENT PRIMARY KEY COMMENT 'ID唯一标识',
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 '性别'
);
在为字段添加约束时,我们只需要在字段之后加上约束的关键字即可,需要关注其语法。我们执行上面的SQL 把表结构创建完成,然后接下来,就可以通过一组数据进行测试,从而验证一下,约束是否可以生效
insert into tb_user(name,age,status,gender) values ('Tom1',19,'1','男'),
('Tom2',25,'0','男');
insert into tb_user(name,age,status,gender) values ('Tom3',19,'1','男');

刷新表,我们可以看到前面的id虽然没有指定插入其添加的值,但是会自增加

insert into tb_user(name,age,status,gender) values (null,19,'1','男');

 执行结果会报错,因为字段name不能为空

 此时我们再次插入Tom3这个重复名字的数据,看看会有什么反应

insert into tb_user(name,age,status,gender) values ('Tom3',19,'1','男');

很显然结果报错,因为Tom3这个名字已经存在了,满足键的唯一性

 此时插入以下数据:

insert into tb_user(name,age,status,gender) values ('Tom4',80,'1','男');

刷新表,我们会发现此时的id不是4,而是自增长为5,为什么呢?因为前面插入了一条Tom3数据,在插入名字之前id已经自增长了一次了(id字段已经插入了),也就是说当插入name字段的时候出问题,结果整体插入失败。

insert into tb_user(name,age,status,gender) values ('Tom5',-1,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom5',121,'1','男');

执行以下SQL:

insert into tb_user(name,age,status,gender) values ('Tom5',-1,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom5',121,'1','男');

插入的年龄都是不在范围内的,结果报错。

上面,我们是通过编写 SQL 语句的形式来完成约束的指定,那加入我们是通过图形化界面来创建表结构时,又该如何来指定约束呢? 只需要在创建表的时候,根据我们的需要选择对应的约束即可。

 

三、外键约束

1.介绍

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

我们来看一个例子:

子表:

父表: 

左侧的emp表是员工表,里面存储员工的基本信息,包含员工的ID、姓名、年龄、职位、薪资、入职日期、上级主管ID、部门ID,在员工的信息中存储的是部门的ID dept_id,而这个部门的ID是关联的部门表dept的主键id,那emp表的dept_id就是外键,关联的是另一张表的主键。

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

 准备数据SQL:

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);
接下来,我们可以做一个测试,删除 id 1的部门信息。
结果,我们看到删除成功,而删除成功之后,部门表不存在 id 1 的部门,而在 emp 表中还有很多的员工,关联的为id 为1的部门,此时就出现了数据的不完整性。 而要想解决这个问题就得通过数据库的外键约束

2.语法

 添加外键

CREATE TABLE 表名(
字段名 数据类型,
...
[CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名)
);
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名)
REFERENCES 主表 (主表列名) ;

 案例

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

alter table emp add constraint dept_id_key foreign key (dept_id)
    references dept(id);
结果如下:

添加了外键约束之后,我们再到dept(父表)删除id1的记录,然后看一下会发生什么现象。 此时将会报错,不能删除或更新父表记录,因为存在外键约束

 删除外键

ALTER TABLE 表名 DROP FOREIGN KEY 外键名称; 1
案例:
删除 emp 表的外键 fk_emp_dept_id
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;

 演示如下:

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

1.CASCADE

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

A. 修改父表id1的记录,将id修改为6

update dept set id=6 where id=1;
我们发现,原来在子表中 dept_id 值为 1 的记录,现在也变为 6 了,这就是 cascade级联的效果。 在一般的业务系统中,不会修改一张表的主键值。

B. 删除父表 id 6 的记录
delete from dept where id=6;
我们发现,父表的数据删除成功了,但是子表中关联的记录也被级联删除了。

2.SET NULL

在进行测试之前,我们先需要删除上面建立的外键 fk_emp_dept_id 。然后再通过数据脚本,将
emp dept 表的数据恢复了
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references
dept(id) on update set null on delete set null ;
接下来,我们删除 id 1 的数据,看看会发生什么样的现象。

我们发现父表的记录是可以正常的删除的,父表的数据删除之后,再打开子表 emp ,我们发现子表 emp的dept_id 字段,原来 dept_id 1 的数据,现在都被置为 NULL 了。

这就是SET NULL这种删除/更新行为的效果。  

以上就是本期的全部内容了,我们下次见!

分享一张壁纸:

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

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

相关文章

如何打sap NOTE

文章目录 1 Introduction2 Method2.1 search note2.2 download note2.3 upload note 3 Summarry 1 Introduction SAP Notes is a set of instructions to remove known errors from the SAP systems. Using the Note Assistant tool, SAP Notes can be applied to the system.…

分类算法入门:以鸢尾花数据集为例

近两年人工智能技术蓬勃发展&#xff0c;OpenAI连续放出ChatGPT、Sora等“王炸”产品&#xff0c;大模型、AIGC等技术带来了革命性的提升&#xff0c;很多人认为人工智能将引领第四次工业革命。国内各大互联网公司也是重点投资布局&#xff0c;从个人角度来说要尽快跟上时代的潮…

记录汇川:IO隔离编程

IO隔离&#xff1a;方便程序修改 无论是输入点坏了还是输出点坏了&#xff0c;或者人为接错线&#xff0c;或者对调点&#xff0c;我们只需要更改IO隔离得输入输出就可以了。方便。 停止按钮外接常闭&#xff0c;里面也使用常闭&#xff0c;为了断线检测功能(安全)&#xff…

基于java ssm springboot女士电商平台系统

基于java ssm springboot女士电商平台系统源码文档设计 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末…

基础刷题50之四(有效的字母异位词)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、题目二、力扣官方题解1、排序2、哈希表 三、文心一言解释1、排序2、哈希表 总结 前言 刚上研一&#xff0c;有人劝我好好学C&#xff0c;当时用的不多就没…

c#触发事件

Demo1 触发事件 <Window x:Class"WPFExample.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"Title"WPF Example" Height"600" Wi…

CSS中的常见选择器

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 往期热门专栏回顾 专栏…

【网络原理】使用Java基于UDP实现简单客户端与服务器通信

目录 &#x1f384;API介绍&#x1f338;DatagramSocket&#x1f338;DatagramPacket&#x1f338;InetSocketAddress &#x1f333;回显客户端与服务器&#x1f338;建立回显服务器&#x1f338;回显客户端 ⭕总结 我们用Java实现UDP数据报套接字编程&#xff0c;需要借用以下…

大数据平台 hive 部署

大数据平台 hive 部署 平台部署知识 文章讲解了 hive 的安装与部署 需要 Hadoop 以及 MySQL。 目录 文章目录 大数据平台 hive 部署目录前期准备解压 hive 包配置 hive 的环境变量解决 jar 冲突 内嵌模式部署修改 hive-env.sh 文件初始化元数据库 使用 derby启动 HDFS 和 hiv…

每日一题leetcode第2834:找出美丽数组的最小和

目录 一.题目描述 二.思路及优化 三.C代码 一.题目描述 二.思路及优化 首先我们看到这个题&#xff0c;就是根据给出的数组元素个数N&#xff0c;从[1&#xff0c;N]找出N个元素&#xff0c;使得N个元素的和最小&#xff0c;其中随便抽两个数出来&#xff0c;两个数之和不能为…

贝叶斯优化CNN-LSTM回归预测(matlab代码)

贝叶斯优化CNN-LSTM回归预测matlab代码 贝叶斯优化方法则采用贝叶斯思想&#xff0c;通过不断探索各种参数组合的结果&#xff0c;根据已有信息计算期望值&#xff0c;并选择期望值最大的组合作为最佳策略&#xff0c;从而在尽可能少的实验次数下达到最优解。 数据为Excel股票…

【MySQL】MySQL 的 SSL 连接以及连接信息查看

MySQL 的 SSL 连接以及连接信息查看 在上篇文章中&#xff0c;我们学习过 MySQL 的两种连接方式&#xff0c;回忆一下&#xff0c;使用 -h 会走 TCP 连接&#xff0c;不使用 -h 可以使用另两种方式来走 UnixSocket 连接。我们就接着这个话题再聊点别的&#xff0c;首先要纠正一…

计算机服务器中了locked勒索病毒怎么解密,locked勒索病毒解密流程

科技的发展带动了企业生产&#xff0c;越来越多的企业开始利用计算机服务器办公&#xff0c;为企业的生产运营提供了极大便利&#xff0c;但随之而来的网络安全威胁也引起了众多企业的关注。近日&#xff0c;云天数据恢复中心接到许多企业的求助&#xff0c;企业的计算机服务器…

图形库实战丨C语言扫雷小游戏(超2w字,附图片素材)

目录 效果展示 游玩链接&#xff08;无需安装图形库及VS&#xff09; 开发环境及准备 1.VS2022版本 2.图形库 游戏初始化 1.头文件 2.创建窗口 3.主函数框架 开始界面函数 1.初始化 1-1.设置背景颜色及字体 1-2.处理背景音乐及图片素材 1-3.处理背景图位置 2.选…

代码随想录算法训练营第四天|24.两两交换链表中的节点、19.删除链表的倒数第N的节点、07.链表相交、142.环形链表II

代码随想录算法训练营第四天|24.两两交换链表中的节点、19.删除链表的倒数第N的节点、07.链表相交、142.环形链表II 24.两两交换链表中的节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成…

【UE5】创建蓝图

创建GamePlay需要的相关蓝图 在内容游览器文件夹中创建文件夹&#xff0c;命名为Blueprints&#xff0c;用来放这个项目的所有蓝图(Blueprint) 在Blueprints文件夹下新建文件夹GamePlay,用存放GamePlay相关蓝图 在Blueprints文件夹下创建文件夹Character,存放角色相关蓝图 在Ga…

idea连接远程服务器

1. 双击shift&#xff0c;出现如下界面 2. 远程连接 原文来自这个up主的&#xff0c;点击蓝色字体就可以跳转啦&#xff01; 输入主机ip、用户名、密码&#xff0c;点击Test Connection验证&#xff0c;最后点击ok添加成功 有用的话记得给俺点个赞&#xff0c;靴靴~

学会与自己和解

最近半年来&#xff0c;在学习智能驾驶方面的技术&#xff0c;但有些文档和资料不方便分享&#xff0c;有一段时间没有写 写文档啦&#xff01;那就写一些技术之外的东西吧&#xff0c;最近也一直在学心理建设&#xff0c;学会与自己和解 行动 唯有自己先行动起来&#xff0c;…

vue组件之间通信方式汇总

方式1&#xff1a;props和$emit props和$emit仅仅限制在父子组件中使用 1.props&#xff1a;父组件向子组件传递数据 1.1 代码展示 <template><div><!-- 这是父组件 --><div>父组件中的基本数据类型age的值是:{{this.age}}</div><div>…

Web Servlet

目录 1 简介2 创建Servlet项目并成功发布运行3 新加Servlet步骤4 Servlet项目练习5 Servlet运行原理6 操作 HTTP Request头的方法(部分方法示例)7 操作 HTTP Response头的方法(部分方法示例)8 两种重定向(页面跳转)方法9 Cookie9.1 Cookie工作原理9.2 cookie构成9.3 Servlet 操…