MySQL第10讲--约束的介绍

前言

  在第9讲MySQL第9讲–函数的介绍中我们主要介绍了几种mysql的内置函数:字符串函数、数值函数、流程函数、日期函数,并对这些函数中常用的几种函数做了总结,如下图所示:

在这里插入图片描述
接下来我们将要讲解一下表结构中的约束;

约束

  • 定义
    约束:约束是作用于表中字段上的规则,用于限制存储在表中的数据;
    作用:用来保证数据库中数据的正确性,有效性和完整性;

那常见的约束的分类有哪些:

约束描述关键字
非空约束限制该字段的数据不能为nullNOT NULL
唯一约束保证该字段的所有数据都是唯一的,不重复的UNIQUE
主键约束主键是一行数据的唯一标识,要求非空且唯一PRIMARY KEY
默认约束保存存数据时,如果未指定该字段的值,则采用默认值DEFAULT
检查约束保证字段值满足某一个条件CHECK
外键约束用来让两个表之间建立连接,保证数据的一致性和完整性FOREIGN KRY
约束的演示
  • 案例1:根据需求完成表结构的创建
字段名字段含义字段类型约束条件约束关键字
idID唯一标识int主键,并且自动增长PRIMARY KEY,AUTO_INCREMENT
name姓名varchar(10)不为空,并且唯一NOT NULL, UNIQUE
age年龄int大于0,并且小于等于120CHECK
status状态char(1)如果没有指定该值,默认为1DEFAULT
gender性别char(1)

创建表结构的语句如下:

create table user1(id int primary key auto_increment comment '主键',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 '性别')comment '用户表';

执行以上语句名为user1的表结构就创建好了;
接下来我们在表中插入数据,插入数据的语句如下:

  • 主键约束
insert into user1(name,age,status,gender) values ('lucy',18,'1', '女'),('lily',18,'0', '女')

结果:
在这里插入图片描述
可以看到在id的关键字处有一个小钥匙,并且我们并没有插入id字段,但是该字段依然存在,这就是第一个知识点主键约束;
  接下来验证一下name的非空约束;

  • 非空约束验证
insert into user1(name,age,status,gender) values (null,30,'1', '男')

结果:
在这里插入图片描述

从上图可以看到当名字为空时,执行语句就会报错,因为他违反了名字为非空的限制条件;

  • 唯一约束验证
    再加入一行数据名字和以前一样
insert into user1(name,age,status,gender) values ('lucy',30,'1', '男')

结果:
在这里插入图片描述
从以上结果可以看出执行这条语句也会报错,因为他不符合名字唯一性的限制条件;

  • 年龄限制条件的验证
insert into user1(name,age,status,gender) values ('kucy2',800,'1', '男');

在这里插入图片描述
如上图所示,当年龄限制超出了限制条件,程序会报错;

  • 默认约束的验证
insert into user1(name,age,gender) values ('kucy2',80, '男');

结果:
在这里插入图片描述
从以上结果可以看出,即使没有指定状态,但是也会有默认状态“1”;

外键约束

概念:外键用来让两张表的数据集之间建立连接,从而保证数据的一致性和完整性;
  如何让两个表之间有关联呢,就需要进行外键的添加,接下来介绍外键添加的语法;

# 第一种是在创建表的时候进行外键的关联
CREATE TABLE 表名{
字段名  数据类型,
.....
[CONSTRAINT] [外键名称] FOREINGT KEY (外键字段名) REFERENCE 主表(主表列名)}
# 第二种方式创建表后再添加外键关联
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREING KEY (外键字段名) REFERENCE 主表(主表列名);

实例1:通过第二种方式进行外键的关联

alter table user1 add constraint fk_emp_dept_id foreign key (dept_id) references dept(id);
#在user1表中键名为dept_id处添加外键

运行后如下图所示,在dept_id列处有一个蓝色的小钥匙,说明外键添加成功,(黄色小钥匙是内键,蓝色的钥匙是外键)
在这里插入图片描述

删除外键

如果外键不需要了就需要删除外键,删除外键的语法如下:

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

实例1:删除外键

alter table user1 drop foreign key fk_emp_dept_id;

执行完语句后查看结果:
在这里插入图片描述
由以上结果可以看到,执行完语句后,对应dept_id处的蓝色小钥匙消失了,说明外键删除成功;

外键删除/更新行为

行为说明
NO ACTION当在父表中删除/更新对应记录时,首先检查该记录是否对应外键,如果有则不允许删除/更新。(与 RESTRICT一致)
RESTRICT当在父表中删除/更新对应记录时,首先检查该记录是否对应外键,如果有则不允许删除/更新。(与 NO ACTION一致)
CASCADE当在父表中删除/更新对应记录时,首先检查该记录是否对应外键,如果有,则也删除/更新外键在子表中的记录。
SET NULL当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键的的值为null(这就要求该外键允许null)
SET DEFAULT父表有变更时,子表将外键列设置成一个默认的值(Innodb不支持)

  那如何添加删除和更新行为的外键约束呢?

  • CASCADE行为外键设置
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREING KEY (外键字段名) REFERENCE 主表(主表列名) ON UPDATE CASCADE ON DELETE CASCADE;

实例1:创建两个表的外键约束

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

运行完语句后结果如下:
在这里插入图片描述
有上述结果可以看到创建了外键约束;接下来我们看一下cascade的用法,我们修改dept表中的id号,看user1中对应的号是否发生变化.
把研发部的id改成6,
在这里插入图片描述
对应的user1中的研发部对应的id也变成了6,如下图所示:
在这里插入图片描述

如果对应的父表数据删除,则子表对应的数据也会相应的被删除。

  • SET NULL行为外键设置
alter table user1 add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update set null on delete set null;

设置完成后删除父表中的对应研发部的id,可以看到子表中对应研发部的dept_id处变成了null.
在这里插入图片描述
以上就是所有的约束条件。
如有错误欢迎指正,如果帮到您了请点赞加收藏哦!

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

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

相关文章

大跨度工业仓储气膜:零排放与消防安全的理想选择—轻空间

在现代工业仓储领域&#xff0c;气膜结构建筑因其独特的优势逐渐受到企业的青睐。它不仅能够提供大跨度的无柱空间&#xff0c;还具备零排放、环保、快速建造、灵活应用等诸多优点&#xff0c;同时满足严格的消防安全要求&#xff0c;是实现高效仓储管理和可持续发展的理想选择…

密钥分发与公钥认证:保障网络通信的安全

在网络通信中&#xff0c;密钥的安全分发和公钥的有效认证是确保系统安全的关键。本文将为基础小白介绍密钥分发与公钥认证的基本概念和实际应用&#xff0c;帮助大家更好地理解这些技术如何保障我们的网络通信安全。 1. 密钥分发与公钥认证的背景 由于密码算法是公开的&…

每天分享一个FPGA开源代码(2)- spi 读写Flash

Flash的用途主要是用于存储主控制器的程序&#xff0c;SPI -Flash芯片就是支持SPI通讯协议的flash芯片。 在FPGA开发中&#xff0c;一般有这两种方式下载程序到板子上&#xff1a; &#xff08;1&#xff09;通过 JTAG下载程序到FPGA中直接运行&#xff0c;下载速度快&#xff…

从误删到重生:2024年数据恢复软件市场新趋势与精选工具

现在科技发展越来越先进&#xff0c;大部分的办公内容也都是通过电脑来进行操作的。但是总免不了偶尔会遇到电脑蓝屏或者其他原因导致数据丢失的情况。那辛辛苦苦做好的材料不见了一定很恼火。这次我分享几个电脑数据恢复工具来解决这个问题。 1.福晰数据恢复 连接直达&#…

C++ | Leetcode C++题解之第392题判断子序列

题目&#xff1a; 题解&#xff1a; class Solution { public:bool isSubsequence(string s, string t) {int n s.size(), m t.size();vector<vector<int> > f(m 1, vector<int>(26, 0));for (int i 0; i < 26; i) {f[m][i] m;}for (int i m - 1; …

操作系统面试真题总结(五)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 线程切换要保存哪些上下文&#xff1f; 当发生线程切换时&#xf…

【论文阅读】Stealing Image-to-Image Translation Models With a Single Query(2024)

摘要 Training deep neural networks(训练深度神经网络) requires(需要) significant computational resources(大量计算资源) and large datasets(大型数据集) that are often confidential(机密的) or expensive(昂贵的) to collect. As a result(因此), owne…

sed awk 第二版学习(二)—— 正则表达式语法

目录 一、表达式 二、成行的字符 1. 反斜杠 2. 通配符 3. 编写正则表达式 4. 字符类 &#xff08;1&#xff09;字符的范围 &#xff08;2&#xff09;排除字符类 &#xff08;3&#xff09;POSIX 字符类补充 5. 重复出现的字符 6. 匹配单词 7. gres 替换脚本 8. …

2024-09-02 Ubuntu固定USB串口名(包括1拖N的USB串口)

在运行Ubuntu系统的开发板上,如果使用可插拔的USB串口,有时候程序正在运行时,如果突然连接传感器的USB串口设备被插拔了一下,这时,会发现系统中的USB串口名发生了改变。例如,插拔之前是/dev/ttyUSB0,插拔之后变成了/dev/ttyUSB3。发生这种情况的时候,有时候会导致程序无…

关于VUE3开发频繁引入ref,reactive,computed等基础函数。

利用unplugin-auto-import插件可以避免频繁引入ref&#xff0c;reactive&#xff0c;computed等基础函数。 1.安装unplugin-auto-import依赖 npm i -D unplugin-auto-import 2.在vite.config.ts中注入依赖 效果

关于主流电商平台|淘宝|拼多多|抖音|1688官方平台接口的接入和返回

taobao.trades.sold.get( 查询卖家已卖出的交 搜索当前会话用户作为卖家已卖出的交易数据&#xff08;只能获取到三个月以内的交易信息&#xff09; 1. 返回的数据结果是以订单的创建时间倒序排列的。 2. 返回的数据结果只包含了订单的部分数据&#xff0c;可通过taobao.trade…

代码随想录Day 32|leetcode题目:501.斐波那契数、70.爬楼梯、746.使用最小花费爬楼梯

提示&#xff1a;DDU&#xff0c;供自己复习使用。欢迎大家前来讨论~ 文章目录 动态规划理论基础一、理论基础1.1 什么是动态规划1.2 动态规划的解题步骤1.3 动态规划应该如何debug 二、题目题目一&#xff1a; 509. 斐波那契数解题思路&#xff1a;动态规划递归解法 题目二&a…

【golang-入门】环境配置、VSCode开发环境配置

golang介绍基础信息 windows环境配置安装包下载安装环境变量设置检查 VSCode开发配置插件配置在 Visual Studio Code 中安装通义灵码go hello word 参考资料 golang介绍 基础信息 golang官网&#xff1a;https://go.dev/golang学习网&#xff1a;https://studygolang.com/使用…

ARM基础知识---CPU---处理器

目录 一、ARM架构 1.1.RAM---随机存储器 1.2.ROM---只读存储器 1.3.flash---闪存存储器 1.4.时钟&#xff08;振晶&#xff09; 1.5.复位 二、CPU---ARM920T 2.1.R0~R12---通用寄存器 2.2.PC程序计数器 2.3.LR连接寄存器 2.4.SP栈指针寄存器 2.5.CPSR当前程序状态寄存…

测试:TestGRPCDiscovery

目录 测试:TestGRPCDiscovery 类定义 方法 async def asyncSetUp(self): async def asyncTearDown(self): async def test_discovery(self): 总结 这是一个关于算力共享中环形结构通讯机制的项目图的功能模型解释。以下是根据所给信息对项目功能的概述: 项目结构: 项…

Windows 下载安装RabbitMQ

环境描述 windows10 Erlang 26.2.x 版本 RabbitMQ 3.13.7 因为RabbitMQ是Erlang语言开发的&#xff0c;所以必须安装 Erlang RabbitMQ官网链接: https://www.rabbitmq.com/docs/which-erlang 1.下载并安装Erlang 26.2.5 1.1下载Erlang 26.2.5 https://erlang.org/dow…

深度强化学习算法(四)(附带MATLAB程序)

深度强化学习&#xff08;Deep Reinforcement Learning, DRL&#xff09;结合了深度学习和强化学习的优点&#xff0c;能够处理具有高维状态和动作空间的复杂任务。它的核心思想是利用深度神经网络来逼近强化学习中的策略函数和价值函数&#xff0c;从而提高学习能力和决策效率…

鸿誉移民:定制化移民服务,吹响全球高效率移民的嘹亮号角!

鸿誉移民&#xff1a;定制化移民服务&#xff0c;吹响全球高效率移民的嘹亮号角&#xff01; 作为国内知名海外移民服务机构&#xff0c;鸿誉移民历经多年行业沉淀&#xff0c;拥有着极其丰富的移民咨询以及移民办理经验&#xff0c;并以咨询及时精准&#xff0c;签证快捷、通…

【数据结构】Map的使用与注意事项

文章目录 概念模型Map 的使用put() 和 get()getOrDefault()remove()keySet()entrySet() 注意事项 概念 Map 和 set 是一种专门用来进行搜索的容器或者数据结构&#xff0c;其搜索的效率与其具体的实例化子类有关。 以前常见的搜索方式有&#xff1a; 直接遍历&#xff0c;时间…

URP简洁的instance的写法

材质还是要开启enable instance&#xff0c;这是上一次的写法 https://dbbh666.blog.csdn.net/article/details/136644181 最近发现更适合我个人的习惯的写法 就是代码控制这个整个过程 C#代码是这样的&#xff0c;获取一个mesh&#xff0c;获取每个mesh的transform&#xff0c…