MySQL第10讲--约束的介绍

news2024/9/20 18:41:34

前言

  在第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.coloradmin.cn/o/2098505.html

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

相关文章

多层数组的formdata格式提交处理

一、数据结构 二、主要代码 for (var i 0; i < this.addProjectContentReqList.length; i) {formData.append(addProjectContentReqList[ i ].contentText, this.addProjectContentReqList[i].contentText);for (var k 0; k < this.addProjectContentReqList[i].co…

《深入理解JAVA虚拟机(第2版)》- 第7章 - 学习笔记

第7章 虚拟机类加载机制 7.1 概述 类的加载机制是&#xff1a;虚拟机将描述类的数据从Class文件中读取到内存中&#xff0c;再对这些数据进行检验、转换解析、初始化&#xff0c;最终生成一个可以被虚拟机直接使用的数据类型。之所以称Java是动态加载和动态连接&#xff0c;是…

如何在Windows系统上安装和配置Git客户端

&#x1f600;前言 在这篇博文中&#xff0c;我将为大家介绍如何在Windows系统上安装和配置Git客户端&#xff0c;包括Git for Windows和TortoiseGit。这些工具是进行版本控制管理的必备工具&#xff0c;特别适合开发者在日常工作中使用。通过这篇文章&#xff0c;您将学会如何…

开放式耳机的优缺点?音质好吗?分享四款开放式蓝牙耳机

作为蓝牙耳机的重度使用患者&#xff0c;我认为开放式耳机音质的好坏取决的因素有好多&#xff0c;包括不同的品牌、不同的‌型号及不同的产品所采用的声学技术&#xff0c;而且开放式耳机的音质好不好也是取决使用者的需求的&#xff0c;有些开放式耳机能提供更清晰的人声音频…

为量产而设计:自动驾驶车辆激光雷达旋转外参在线标定与异常排除策略

更多精彩内容&#xff0c;请关注公众号&#xff1a;智驾机器人技术前线 1.论文信息 论文标题&#xff1a;Fault Detection and Exclusion for Robust Online Calibration of Vehicle to LiDAR Rotation Parameter 作者&#xff1a;Jiwon Seok, Chansoo Kim, Paulo Resende, B…

黑马点评4——优惠券秒杀—分布式锁

文章目录 分布式锁什么是分布式锁分布式锁的实现基于redis实现分布式锁分布式锁初级版本redis分布式锁的误删问题分布式锁的原子性问题lua脚本解决多条命令原子性问题Java调用lua脚本改进redis的分布式锁分布式锁-Redisson功能介绍分布式锁-Redisson快速入门Redisson可重入原理…

vue3+vant4父组件点击提交并校验子组件form表单

先看效果 代码如下 父组件 <template><ChildForm ref"childFormRef" /><button click"validateForm">校验表单</button> </template> <script setup> import { ref } from vue; import ChildForm from ./ChildForm.…

【Python系列】异步任务的终止

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

如何在S7-200 SMART CPU断电后保持高速计数器的当前值

1、首先是问题描述 S7-200 SMART的断电数据保持不支持高速计数器的范围设置&#xff0c;因此高速计数器的当前值在CPU每次断电后都会复位为数值0。要使S7-200 SMART高速计数器的当前值在CPU断电重启后依然保持&#xff0c;可以通过以下的编程来实现。 在此以通过向导生成高速…

MapStruct-Java实体转换利器

MapStruct-Java实体转换利器 MapStruct 概述MapStruct 使用例子UserDTOUserEntityUserDTOConverter ( mapstruct 接口)UserModelConverterImpl &#xff08;自动生成&#xff09;Service 层使用 MapStruct 概述 MapStruct 是一个用于生成映射器接口的代码生成库&#xff0c;主…

哪款宠物空气净化器性价比高,希喂、霍尼韦尔真实测评分享

几年前养宠物就帮我开启了一个全新的体验。下班回去后能看到它在门口处摇着尾巴&#xff0c;眨巴着个大眼的等我回家&#xff1b;每天醒来就看到它在我的身边安安静静的躺着&#xff0c;实在是一幅岁月静好的画面。但如果没有浮毛和异味困扰的话&#xff0c;我相信会更好。 随…

ChatTTS文本转语音本地Windows环境部署与远程生成AI音频实战流程

文章目录 前言1. 下载运行ChatTTS模型2. 安装Cpolar工具3. 实现公网访问4. 配置ChatTTS固定公网地址 前言 本篇文章主要介绍如何快速地在Windows系统电脑中本地部署ChatTTS开源文本转语音项目&#xff0c;并且我们还可以结合Cpolar内网穿透工具创建公网地址&#xff0c;随时随…

【BLE】四.SMP安全配对详解

设备配对流程 SMP专业术语 Paring&#xff08;配对&#xff09;&#xff1a; 配对能力交换&#xff0c;设备认证&#xff0c;密钥生成&#xff0c;连接加密以及机密信息分发等 过程 Bonding&#xff08;绑定&#xff09; 配对中会生成一个长期密钥&#xff08;LTK&#xff0c;…

022集—— 字符串按ascii码转数字——C#学习笔记

字符串分解为字符&#xff0c;字符分别转为ascii对应数字&#xff0c;最后数字连接起来转为字符串&#xff0c;具体如下&#xff1a; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Console…

【Next】3. 开发规范

笔记来源&#xff1a;编程导航 1、约定式路由 Next.js 使用 约定式路由&#xff0c;根据文件夹的结构和名称&#xff0c;自动将对应的 URL 地址映射到页面文件。 常见的几种路由规则如下&#xff1a; 1&#xff09;基础规则&#xff1a;以 app 目录作为根路径&#xff0c;根…

mybatis-plus添加replace(自定义)方法,添加sql注入器SqlInjector

1. 继承DefaultSqlInjector import com.baomidou.mybatisplus.core.injector.AbstractMethod; import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; import com.baomidou.mybatisplus.core.metadata.TableInfo; import org.springframework.stereotype.Compon…

网络安全宣传周知识竞赛答题小程序怎么做?

随着网络安全宣传周的到来&#xff0c;越来越多的单位开始组织员工进行线上学习网络安全相关知识&#xff0c;其中举办网络安全知识竞赛答题活动的效果尤为明显&#xff0c;以下是一些网络安全答题系统的功能亮点&#xff1a; 多样化的题目类型与灵活的出题方式&#xff1a; 丰…

92.游戏的启动与多开-多开检测概述

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;易道云信息技术研究院 上一个内容&#xff1a;91.游戏的启动与多开-游戏启动 正常来说任何一个软件一双击就会打开&#xff0c;只要软…

一文读懂PINGPONG:0成本在普通家用机上运行多个网络节点

概述 l pingpong项目设计的愿景便是降低去中心化网络的节点运行难度&#xff0c;让普通人也可以参与到节点运行中&#xff1b; l 这个周期里&#xff0c;随着Depin和AIWeb3叙事的爆发&#xff0c;众多中小型去中心化网络面临着节点运行者供需不匹配的问题&#xff0c;严重影响…