【MySQL】约束(三)

news2024/10/6 8:28:22

🚗MySQL学习·第三站~
🚩本文已收录至专栏:MySQL通关路
❤️每章节附章节思维导图,文末附全文思维导图,感谢各位点赞收藏支持~# 一.引入

约束作用于表中字段上规则,用于限制存储在表中的数据。 使用约束可以保证数据库中数据的正确、有效性以及完整性。我们可以在创建表或修改表的时候在表字段上添加约束。

约束分为如下几种:

约束描述关键字
非空约束限制该字段的数据不能为nullNOT NULL
唯一约束保证该字段的所有数据都是唯一、不重复的、可以为空UNIQUE
主键约束主键是一行数据的唯一标识,要求非空且唯一PRIMARY KEY
默认约束保存数据时,如果未指定该字段的值,则采用默认值DEFAULT
检查约束插入数值时根据指定条件校验合法性(8.0.16版本之后开始)CHECK
外键约束用来让两张表的数据之间建立连接,保证数据的一致性和完整性FOREIGN KEY

我们先通过一个示例介绍前五个约束,最后再介绍外键约束~

二.普通约束

在这里插入图片描述

(1) 示例说明

在开发过程中,如果我们想要持久化存储数据就不可避免的需要建立相关表。而建表以后对于插入其中的数据,如果我们后台没有校验,数据库也没有约束的话将显得十分混乱,接下来我们通过指定约束来规范数据。

字段名字段含义字段类型约束条件约束关键字
idID唯一标识int主键,并且自动增长PRIMARY KEY, AUTO_INCREMENT
name姓名varchar(10)不为空,并且唯一NOT NULL , UNIQUE
age年龄int大于0,并且小于等 于120CHECK
status状态char(1)如果没有指定该值, 默认为1DEFAULT
test测试int无约束对比测试字段

(2) 建表时指定约束

在创建表的时候为字段添加约束时,我们只需要在字段类型之后加上约束的关键字即可。例如:

CREATE TABLE 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  '状态',
    test int  COMMENT  '无约束对比测试字段'
 );

特别说明:

  • 当我们使用check约束时,约束条件必须写在()中。
  • 当我们使用default约束指定默认值时,默认值必须符合字段数据类型
  • 每个表只能为一个字段指定主键PRIMARY KEY约束。
  • 在一些正常情况下,可以在一个字段上使用多个约束条件
    在这里插入图片描述

(3) 建表后指定约束

我们重新创建一张没有约束的user表来演示~

  • 添加主键约束primary key
alter table 表名 add primary key(表字段名);

在这里插入图片描述

  • 添加唯一约束unique
add table 表名 add unique(表字段名);

在这里插入图片描述

  • 添加非空约束(not null)
alter table 表名 modify 字段名 数据类型 not null

在这里插入图片描述

  • 添加默认约束default
alter table 表名 modify 字段名 数据类型 default 默认值;

在这里插入图片描述

  • 添加检查约束(check)
alter table 表名 add constraint 字段名 check(约束条件);

在这里插入图片描述

(4) 插入测试

上述我们已经完成了约束的创建,接下来我们来测试一下约束是否生效~

  • 主键 + 自增
    在这里插入图片描述

  • 唯一 + 非空
    在这里插入图片描述

  • 默认约束
    在这里插入图片描述

  • 检查约束
    在这里插入图片描述

三.外键约束

在这里插入图片描述

外键约束通过作用于两张表之间,用于相互约束彼此的行为,从而保证数据的一致性和完整性。

(1) 引入

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

我们可以看出这两张表之间存在着一种关联关系,但它们只是在逻辑上存在这样一层关系;在数据库层面,并未建立外键关联。也就说emp表中的dept_id值可以为任意数值,即是dept表中不存在。而dept表中字段被emp使用了也可以随意删除。 因此无法保证数据的一致性和完整性的。这时候就需要我们严格的进行手动维护或者使用外键约束

(2) 添加外键

特别说明:

  • 添加外键时必须得确保需要关联的父表已经创建
  • 一个表可存在多个外键,且可以关联多个表

(2.1) 建表时添加

  • 语法说明
CREATE TABLE 表名(
字段名    数据类型,
 ...
 [CONSTRAINT] [外键名称]  FOREIGN  KEY (子表字段名)   REFERENCES   父表 (父表字段名)
);
  • 示例演示
# 必须先创建需要关联的父表 (dept)
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',
 CONSTRAINT fk_dept_id foreign key (dept_id) references dept(id)
 )comment '员工表';

在这里插入图片描述

(2.2) 建表后添加

  • 语法说明
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (子表字段名) REFERENCES 父表 (父表字段名);
  • 示例演示
    在这里插入图片描述
    在这里插入图片描述

(2.3) 外键测试

添加外键约束后我们无法随意删除父表中的数据,必须先删除所有子表中关联到改记录的数据才能删除父表中数据。
在这里插入图片描述

(3) 删除外键

  • 语法
ALTER TABLE  表名   DROP  FOREIGN  KEY  外键名称;
  • 示例演示
    在这里插入图片描述

在这里插入图片描述

(4) 删除/更新行为

在添加了外键之后,再删除父表数据时产生的约束行为,我们就称为删除/更新行为。具体的删除/更新行为有以下几种:

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

注意事项:NO ACTIONRESTRICT为外键约束的默认行为,也就是在一些情况下阻止我们删除/更新数据,添加外键时默认生效。如果需要修改为其他几种行为则需要我们在添加外键时手动设置。

  • 修改删除/更新语法:
ALTER TABLE  表名  ADD CONSTRAINT  外键名称  FOREIGN KEY  (外键字段)   REFERENCES   
父表名 (父表字段名)  ON UPDATE [更新行为] ON DELETE [删除行为]
  • CASCADE行为演示
    在这里插入图片描述
    在这里插入图片描述

  • SET NULL行为演示
    在这里插入图片描述

在这里插入图片描述

四.全文概览

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

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

相关文章

DuiLib基本流程解析

文章目录 1、DuiLib基本流程 1、DuiLib基本流程 duilib的基本流程如上图&#xff0c;通过解析一个xml文件&#xff0c;将文件中的内容渲染为窗口界面&#xff0c;这个解析过程由WindowImplBase类来完成。 基本框架如下&#xff1a; 首先在公共头文件中加入如下内容&#xff1a…

python与深度学习(一):ANN和手写数字识别

目录 1. 神经网络2. 线性回归3. 激活函数3.1 Sigmoid函数3.2 Relu函数3.3 Softmax函数 4. ANN(全连接网络)模型结构5. 误差函数5.1 均方差误差函数5.2 交叉熵误差函数 6. 手写数字识别实战6.1 工具说明6.2 导入相关库6.3 加载数据6.4 数据预处理6.5 数据处理6.6 构建网络模型6.…

MySQL 备份和还原

目录 一、数据备份的重要性 二、数据库备份类型 2.1 物理备份 2.2 逻辑备份 1.完全备份 2.差异备份 3.增量备份 三、常见的备份方法 3.1 物理冷备 3.2 专用备份工具 mysqldump 或 mysqlhotcopy 3.3 启用二进制日志进行增量备份 3.4 第三方工具备份 四、MySQL完全备份…

HJ53 杨辉三角的变形

描述 以上三角形的数阵&#xff0c;第一行只有一个数1&#xff0c;以下每行的每个数&#xff0c;是恰好是它上面的数、左上角数和右上角的数&#xff0c;3个数之和&#xff08;如果不存在某个数&#xff0c;认为该数就是0&#xff09;。 求第n行第一个偶数出现的位置。如果没…

v-bind复习

1.v-bind 绑定元素属性  前端讲的一系列指令&#xff0c;主要是将值插入到模板内容中。  但是&#xff0c;除了内容需要动态来决定外&#xff0c;某些属性我们也希望动态来绑定。  比如动态绑定 a 元素的 href 属性&#xff1b;  比如动态绑定 img 元素的 src 属性&am…

企业数字化转型的“有为”与“数字化”

对企业而言&#xff0c;推动数字化转型势在必行&#xff0c;但困难重重&#xff0c;需要破旧立新的战略设计&#xff0c;更需要循序渐进的策略部署。对企业而言&#xff0c;唯有坚持“有为数据、有为组织、有为决策、有为创新”的理念和目标&#xff0c;探索战略、设施、资源、…

Python对Excel不同的行分别复制不同的次数

本文介绍基于Python语言&#xff0c;读取Excel表格文件数据&#xff0c;并将其中符合我们特定要求的那一行加以复制指定的次数&#xff0c;而不符合要求的那一行则不复制&#xff1b;并将所得结果保存为新的Excel表格文件的方法。 这里需要说明&#xff0c;在我们之前的文章Pyt…

动态规划——粉刷房子

题目链接 leetcode在线oj题——粉刷房子 题目描述 假如有一排房子&#xff0c;共 n 个&#xff0c;每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种&#xff0c;你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。 当然&#xff0c;因为市场上不同颜色油…

NTFS权限

文章目录 一、NTFS权限概述二、文件系统概述三、NTFS文件系统特点1. 提高磁盘读写性能2. 可靠性3. 磁盘利用率4. 支持单个文件大于4个G 四、修改NTFS权限1. 取消权限继承2. 文件及文件夹权限3. 权限累加4. 拒绝最大5. 取得所有权6. 强制继承7. 文件复制对权限的影响 一、NTFS权…

天津良心python培训班品牌(Python开发的主要领域)

Python可以用于各种领域&#xff0c;如数据科学、机器学习、人工智能、网络编程等等&#xff0c;因此&#xff0c;学习Python可以为零基础同学提供广泛的职业选择&#xff0c;并为其他编程语言打下坚实的基础。 自学python要多久 python是一门非常适合初学者入门的编程语言&a…

Resultful风格代码代码实践

1.原则 GET 查询 POST 添加 PUI(全字段更新)、PATCH(更新部分字段)更新 DELETE 删除 2.使用复数名词 user> users car > cars product > products 3.请求和响应时候指定accpect: RequestBody reponse: ResponseBody 4.资源唯一标识在通过参数传递时使用路径传递传递 u…

128TB只要128元,国产山寨 SSD 把老外割疯了

国产颗粒崛起带动的 SSD 白菜价&#xff0c;你永远不知道现在的史低价是不是又在山顶。 不过&#xff0c;我如果拿出几乎1折的 990 Pro &#xff0c;阁下应该如何应对&#xff1f; 正如上图所见&#xff0c;Amazon、AliExpress、Ebay 等老外用的网购平台上有很多这样「做慈善」…

Error:(3, 32) java: 程序包org.springframework.boot不存在

idea2018创建springboot的maven项目&#xff0c;之前创建项目都可以正常使用&#xff0c;突然创建这个项目之后就无法拉取依赖&#xff0c;反复刷新maven都没有用。 在网上看了一大堆文件说改这改那&#xff0c;结果都是错的。 最总解决方法&#xff1a; 错误原因是springboo…

JavaScript基础篇(1-10题)

此文章&#xff0c;来源于印客学院的资料【第一部分&#xff1a;基础篇(105题)】&#xff0c;这里只是分享&#xff0c;便于查漏补缺。 诸君可以根据自己实际情况&#xff0c;自行衡量&#xff0c;看看哪里需要加强。 概述如下&#xff1a; 闭包说说你对作用域链的理解JavaSc…

JavaCV音视频开发宝典:如何使用JavaCV读取mp3文件ID3V2专辑封面图片显示并保存成jpg图片和png图片并保留png透明度

《JavaCV音视频开发宝典》专栏目录导航 《JavaCV音视频开发宝典》专栏介绍和目录 ​ 前言 在此之前,我们已经使用开源库"MP3AGIC“去操作mp3,读取封面图像,那么使用JavaCV能不能做到呢? 当然可以。 当然封面图片有两种情况,一种是使用jpg图片作为封面的,这种比较简…

Oracle Profile概念与示例

Profile和SQL Profile是不同的&#xff0c;前者是用CREATE PROFILE创建&#xff0c;后者和SQL Tuning有关。 profile的定义为&#xff1a; which is a set of limits on database resources. If you assign the profile to a user, then that user cannot exceed these limits…

【简单易懂版】使用IDEA操作Hadoop(增删改查)

文章目录 一、引入hdfs依赖二、创建hdfs工具类三、测试hdfs工具类反思 前提&#xff1a;服务器中已经配置好了hadoop 本人亲测&#xff0c;以下代码已经跑通&#xff0c;基础功能都可以完成&#xff01;&#xff01;&#xff01;希望对大家有用&#xff01;&#xff01;&#x…

2023年,如何顺利通过品牌备案?

众所周知&#xff0c;在当今社会一个产品要想在市场上立足的话&#xff0c;那树立自己的品牌形象就显得尤为重要了&#xff0c;品牌形象树立起来了&#xff0c;才能够更好的得到消费者的认可&#xff0c;才会有更多的消费者来购买产品。 品牌代表了专业、规范、保证、服务等维…

解密算法王国:揭秘程序员必备技能(超详细)

解密算法王国&#xff1a;揭秘程序员必备技能&#xff08;超详细&#xff09; 概述一、算法基础二、排序算法2.1 冒泡排序 (Bubble Sort)2.2 插入排序 (Insertion Sort)2.3 快速排序 (Quick Sort)2.4 归并排序 (Merge Sort) 三、查找算法3.1 线性查找 (Linear Search)3.2 二分查…

idea专业版和idea社区版整合Tomcat,并将war包部署

文章目录 idea专业版和idea社区版整合Tomcat&#xff0c;并将war包部署一、idea专业版部署二、idea社区版部署三、错误案例 idea专业版和idea社区版整合Tomcat&#xff0c;并将war包部署 开发过程中&#xff0c;由于需要运用云平台&#xff0c;所以从新配置开发环境&#xff0…