【MySQL】 约束

news2025/6/6 11:49:59

一、约束的定义

MySQL 约束是用于限制表中数据的规则,确保数据的 准确性一致性 。约束可以在创建表时定义,也可以在表创建后通过修改表结构添加。

二、常见的约束类型

2.1 NOT NULL 非空约束

加了非空约束的列不能为 NULL 值,如果可以预见某个列不可能为空,例如(性别:男 或 女 或者 保密)建议都加上非空约束,有利于查询效率的提高

这里创建一个 student 表,没有添加任何约束

我们可以往表里添加 NULL 数据,但这是无意义的

接下来通过修改表给 name 列添加上非空约束

数据库报错:不能对已经有 NULL 的列添加 非空约束

可以通过将带有 NULL 的数据删除或者将列删除重新创建来进行修改吗?

这里选择删除列后再重新创建,再尝试往 name 列里添加 NULL

数据库报错:'name' 列不能为空

对表进行查看可以看到 name 的 NULL 列变成 NO 了

但是数据依然存在,所以还是需要通过 删除数据 来进行修改,但数据量大时也不方便。所以最好还是在一开始创建表时就对每个数据做好分析,提前选择好约束

2.2 DEFAULT 默认值约束

当某个列没有被插入指定数据时则为默认值

插入数据时注意不能使用全列插入

数据库报错:列的数量和输入值的数量不一致

只能使用指定列插入才可以

查看表可以看到,hobby 列的 DEFAULT 的被修改为了 '无'

2.3 UNIQUE 唯一约束

当我们遇到需要存入不能重复的数据时(例如:身份证号,学号等等)就可以使用 UNIQUE 来指定唯一约束的列

添加约束前

将 id 列添加 UNIQUE 约束后再进行添加数据

数据库报错:添加键中的值 1 与列中值重复

注意:只添加了 UNIQUE 的列可以写入多个 NULL

查看表可以看到,id 列的 KEY 的添加了 UNI 表示不可重复

2.4 PRIMARY KEY 主键约束

主键约束唯一标识数据库表中的每条几率,可以理解为当前数据行的身份信息

主键必须包含唯一的值,且不能包含 NULL 的值(唯一且非空)

  • 既然是唯一且非空是否能用 id int unique not null 来代替主键呢?答案是不可以的,这里要区分开unique not null 是业务对数据本身的需求,primary key则是表的特性,数据如何组织依赖主键

通常为每张表指定一个主键,主键列建议使用 BIGINT 类型(范围够大)

重新创建表 student

查看表可以看到,id 列的 Key 变为了 PRI

因为 PRIMARY KEY 的特性一般把主键设为自动增长 (auto_increment),插入数据对应字段不给值时,使用最大值+1。

语法:

id INT PRIMARY KEY auto_increment,

可以看到 Extra 处已经有了 自增标识,写入数据时就不用人为的去维护主键值。

可以使用指定列插入

也可以用全列插入,但是需要指定为值为 NULL(并不是为空,而是让数据库去填写)

可以通过命令 show create table 表名 来查看表的具体信息

这里的 AUTO_INCREMENT = 4 是告诉我们下个存入的数据 ID 会等于 4,如果已经设置了自动增长还主题设置 ID 值呢?数据是可以被正常添加的

AUTO_INCREMENT 的值会来到101,如果再添加一个 ID 为 4 的值,也是能正常添加的

但是 AUTO_INCREMENT 的值不会再变小,这是基于对数据的安全考虑,中间浪费的区间也能是浪费了。
每个表只能有一个主键,可以由单个列或者多个列组成。还是重新创建一个 student 表,通过PRIVARY KEY(列名1,列名2...)来指定主键,多个列组成的主键称作 复合主键

复合主键中的每一列不能同时相等

主键或唯一键冲突时的更新操作,插入否则更新

语法:

INSERT ... ON DUPLICATE KEY UPDATE column = value [, column = value] ...

可以看到这里的更新操作针对两行进行了操作,删除了原来的行,又新增了一条记录。如果主键没有冲突则新增一条直接记录。

在实际开发中不建议直接替换老数据:

  1. 先按条件查询一下数据,有没有相应的记录
  2. 没有的话就 insert 一条新记录
  3. 有的话,要么做 update 操作,要么把原数据的删除标识置为已删除,再写一条新数据

2.5 FOREIFN KEY 外键约束

外键用于定义主表和从表之间的关系

外键约束定义在从表的列上,主表关联的列必须是主键或唯一约束

当定义外键后,要求从表中的外键列数据必须在主表的主键或唯一列存在或为 null

主要作用:

  1. 确保引用完整:防止从表引用不存在的主表记录,确保数据逻辑关系正确;
  2. 维护数据一致:当主表数据变更时,数据库可以自动处理子表相关数据;
  3. 防止孤立记录:会阻止删除被引用的主表记录,避免子表记录因主表删除或修改导致变成“孤立记录”;
  4. 优化查询性能:这样的设计方法可以减少许多不必要数据的冗余。

语法:

foreign key (class_id) references class (id)

实例:

创建一个班级表 class , id 为主键

创建一个学生表,一个学生对应一个班级,一个班级对应多个学生,用 id 为主键,class_id 为外键,关联表 id

再在表中插入数据

当我们插入引用不存在的数据或是对主表中数据进行删除时

数据库都会进行报错:不能删除这一行,有一个外键约束

如果希望实现当主表修改时,从表自动更新,需要在约定外键时,补充  ON DELETE CASCADE

 FOREIGN KEY 外键 REFERENCES 主键 ON DELETE CASCADE

如果外键约束的特性,删改一定要先删除从表中的数据,导致在实际工作中一般不使用,可以通过在 JAVA 层面处理关联关系,保证数据正确后再入库

2.6 CHECK 约束

引用于一个或多个列,用于限制列中可接受的数据值,从而确保数据的完整性和准确性

这里创建了一个 teacher 表,同时对表中的 gender 做了约束,规定只能为 男 或者 女

当我们使用规定之外的词就会进行报错,约束之内就可以正常输入

列与列直接也可以比较,需要在单独一行定义

示例:

CREATE TABLE t_check (
    c1 int check(c1 <> 0),
    c2 int check(c2 > 0),
    c3 int,
    check(c3 >= c2)
);

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

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

相关文章

前端vue打开多个窗口,关闭窗口后才继续执行后续逻辑

1.打开第一个弹窗 弹窗的按钮代码 2.点击窗口1中按钮&#xff0c;打开新的窗口 // 请领单按钮点击 async cb_6_delClick() {let ls_yfbm this.st_3Value.BMBMlet pstring {}pstring.a ls_yfbmpstring.b this.queryFormDialog.outDepotDeptCodeawait this.openwithparm_w_md…

「深度拆解」Spring Boot如何用DeepSeek重构MCP通信层?从线程模型到分布式推理的架构进化

什么是MCP&#xff1f; MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;是由Anthropic公司于2024年11月推出的开放标准协议&#xff0c;旨在为大型语言模型&#xff08;LLM&#xff09;与外部数据源、工具及系统提供统一的交互接口&#xff0c;被…

【西门子杯工业嵌入式-2-点亮一颗LED】

西门子杯工业嵌入式-2-点亮一颗LED 一、课程回顾与目标1.上节课内容回顾2.本节课目标 二、硬件连接与原理1. 硬件连接方式2. 连接实例 三、GPIO原理知识1. GPIO结构2. 推挽输出模式原理 四、软件实现步骤1. 项目结构设置2. 函数定义3. led.c 文件编写初始化函数 led_init交替闪…

代码随想录算法训练营第60期第五十五天打卡

大家好&#xff0c;我们今天继续我们图论的部分&#xff0c;其实我们昨天是主要讲解了深搜与广搜的理论基础&#xff0c;我们大体上了解了两种算法的差异与适用情景&#xff0c;今天我们就继续我们的图论的章节&#xff0c;以后几天的题目是图论中比较有名的问题叫做岛屿问题&a…

重磅更新! 基于Gemini 2.5 Pro打造的AI智能体PlantUML-X上线!

目录 图表绘制AI智能体PlantUML-X上线通过简单的提示词创建各种UML图&#xff1a;轻松搞定其它类型的技术图表&#xff1a; AI智能体PlantUML-X功能实测画一个在Java中的一个简单的用户登录功能的时序图效果展示&#xff1a;根据详细内容生成系统架构图效果展示&#xff1a;效果…

[5-02-04].第01节:Jmeter环境搭建:

JMeter笔记大纲 Jmeter依赖于JDK&#xff0c;所以必须确保当前计算机上已经安装了JDK&#xff0c;并且配置了环境变量 一、JMeter概述&#xff1a; 1.1.JMeter是什么&#xff1a; JMeter是Appache组织使用java开发的一款测试工具 可以用于对服务器、网络或对象模拟巨大的负载…

AI智能推荐实战之RunnableParallel并行链

导读&#xff1a;在现代AI应用开发中&#xff0c;如何高效处理多维度数据分析始终是开发者面临的核心挑战。当您需要同时进行情感分析、关键词提取和实体识别&#xff0c;或者要对比多个AI模型的输出结果时&#xff0c;传统的串行处理方式往往效率低下。 本文将深入解析LangCha…

Gemini开源项目DeepResearch:基于LangGraph的智能研究代理技术原理与实现

引言 在人工智能快速发展的今天&#xff0c;如何构建一个能够进行深度研究、自主学习和迭代优化的AI系统成为了技术前沿的重要课题。Gemini开源的DeepResearch一周收获7.9k Star&#xff0c;Google的开源项目Gemini DeepResearch技术通过结合LangGraph框架和Gemini大语言模型&…

Doris Catalog 联邦分析查询性能优化:从排查到优化的完整指南

在大数据分析中&#xff0c;Doris 的 Catalog 联邦分析功能为整合多源数据提供了有力支持。然而&#xff0c;在实际应用中&#xff0c;可能会遇到各种问题影响其正常运行。本文将详细剖析这些问题并提供解决方案。 一、联邦分析查询慢&#xff1a;内外表通用排查逻辑 当遇到 …

01 Deep learning神经网络的编程基础 二分类--吴恩达

二分类 1. 核心定义 二分类任务是监督学习中最基础的问题类型&#xff0c;其目标是将样本划分为两个互斥类别。设样本特征空间为 X ⊆ R n \mathcal{X} \subseteq \mathbb{R}^n X⊆Rn&#xff0c;输出空间为 Y { 0 , 1 } \mathcal{Y} \{0,1\} Y{0,1}&#xff0c;学习目标为…

视频自动化分割方案:支持按时间与段数拆分

在日常视频处理任务中&#xff0c;如何快速将一个较长的视频文件按照指定规则拆分为多个片段&#xff0c;是许多用户都会遇到的问题。尤其对于需要批量处理视频的开发者、自媒体运营者或内容创作者来说&#xff0c;手动剪辑不仅效率低下&#xff0c;还容易出错。这是一款绿色免…

股指期货合约价值怎么算?

股指期货合约价值就是你买一手股指期货合约&#xff0c;理论上值多少钱。这个价值是根据期货的价格和合约乘数来计算的。就好比你买了一斤苹果&#xff0c;价格是5块钱一斤&#xff0c;那你买一斤就得付5块钱。股指期货也是一样&#xff0c;只不过它的计算稍微复杂一点点。 一…

【QT】使用QT帮助手册找控件样式

选择帮助—》输入stylesheet(小写)—》选择stylesheet—》右侧选择Qt Style Sheets Reference 2.使用CtrlF—》输入要搜索的控件—》点击Customizing QScrollBar 3.显示参考样式表–》即可放入QT-designer的样式表中

计算机网络(5)——数据链路层

1.概述 数据链路层负责一套链路上从一个节点向另一个物理链路直接相连的相邻节点传输数据报。换言之&#xff0c;主要解决相邻节点间的可靠数据传输 节点(nodes)&#xff1a;路由器和主机 链路(links)&#xff1a;连接相邻节点的通信信道 2.数据链路层服务 2.1 组帧 组帧(fra…

VuePress完美整合Toast消息提示

VuePress 整合 Vue-Toastification 插件笔记 记录如何在 VuePress 项目中整合使用 vue-toastification 插件&#xff0c;实现优雅的消息提示。 一、安装依赖 npm install vue-toastification或者使用 yarn&#xff1a; yarn add vue-toastification二、配置 VuePress 客户端增…

adb 连不上真机设备问题汇总

问题一、无法弹出 adb 调试授权弹窗 详细描述&#xff1a; 开发者选项中已打开 usb 调试&#xff0c;仅充电模式下 usb 调试也已打开&#xff0c;电脑通过 usb 连上手机后&#xff0c;一直弹出 adb 调试授权弹窗&#xff0c;尝试取消授权再次连接&#xff0c;还是无法弹出问题…

[yolov11改进系列]基于yolov11引入注意力机制SENetV1或者SENetV2的python源码+训练源码

本文给大家带来的改进机制是SENet&#xff08;Squeeze-and-Excitation Networks&#xff09;其是一种通过调整卷积网络中的通道关系来提升性能的网络结构。SENet并不是一个独立的网络模型Q&#xff0c;而是一个可以和现有的任何一个模型相结合的模块&#xff08;可以看作是一种…

鸿蒙仓颉语言开发实战教程:商城搜索页

大家好&#xff0c;今天要分享的是仓颉语言商城应用的搜索页。 搜索页的内容比较多&#xff0c;都有点密集恐惧症了&#xff0c;不过我们可以从上至下将它拆分开来&#xff0c;逐一击破。 导航栏 搜索页的的最顶部是导航栏&#xff0c;由返回按钮和搜索框两部分组成,比较简单…

图像去雾数据集总汇

自然去雾数据集 部分的数据清洗可以看这里&#xff1a;图像去雾数据集的下载和预处理操作 RESIDE-IN 将ITS作为训练集&#xff0c;SOTSindoor作为测试集。训练集13990对&#xff0c;验证集500对。 目前室内sota常用&#xff0c;最高已经卷到PSNR-42.72 最初应该是dehazefo…

网络攻防技术十四:入侵检测与网络欺骗

文章目录 一、入侵检测概述二、入侵系统的分类三、入侵检测的分析方法1、特征检测&#xff08;滥用检测、误用检测&#xff09;2、异常检测 四、Snort入侵检测系统五、网络欺诈技术1、蜜罐2、蜜网3、网络欺骗防御 六、简答题1. 入侵检测系统对防火墙的安全弥补作用主要体现在哪…