从入门到精通【 MySQL】 数据库约束与设计
文章目录
- 📕1. 数据库约束
- ✏️1.1 NOT NULL 非空约束
- ✏️1.2 DEFAULT 默认值约束
- ✏️1.3 UNIQUE 唯一约束
- ✏️1.4 PRIMARY KEY 主键约束
- ✏️1.5 FOREIGN KEY 外键约束
- ✏️1.6 CHECK 约束
- 📕2. 数据库设计
- ✏️2.1 第一范式
- ✏️2.2 第二范式
- ✏️2.3 第三范式
- ✏️2.4 设计过程
- ✏️2.5 实体-关系图
📕1. 数据库约束
数据库约束是指对数据库表中的数据所施加的规则或条件,用于确保数据的准确性和可靠性。这
些约束可以是基于数据类型、值范围、唯一性、非空等规则,以确保数据的正确性和相容性。
✏️1.1 NOT NULL 非空约束
create table 表名(列名1 数据类型 not null,
)
非空约束是用来保证某列的值不能为空的,类似于学生姓名,学号,身份证号这些必要的信息都可以设置为非空约束,如果这些信息为null的话是没有意义的。

当我们查看表结构时,有非空约束就会显示NO,没有非空约束就会显示YES
✏️1.2 DEFAULT 默认值约束
create table 表名(列名1 数据类型 default 默认值,
)
默认值约束是指当我们没有在某列填写数据时,则mysq会自动帮我们生成一个默认值填进去,而这个默认值就是我们自己设置的 default 默认值约束。

通过表结构我们可以发现,不设置默认值的时候default对应的时null。
当插入数据时,如我们指定了插入的值,则插入我们指定的值,否则自动填充默认值。如果我们想指定插入null值,也是可以的。
✏️1.3 UNIQUE 唯一约束
create table 表名(列名1 数据类型 unique,
)
指定了唯一约束的列,该列的值在所有记录中不能重复,比如一个人的身份证号,学生的学号等。

当我们查看表结构时,Key列显示UNI表示唯一约束
✏️1.4 PRIMARY KEY 主键约束
-- primary key 是主键关键字
-- auto_ increment是自增长关键字
create table 表名(列名1 数据类型 PRIMARY KEY auto_increment,
)
- 主键约束唯一标识数据库表中的每条记录。
- 主键必须包含唯一的值,且不能包含 NULL 值。
- 每个表只能有一个主键,可以由单个列或多个列组成。
- 通常为每张表都指定一个主键,主键列建议使用BIGINT类型
- 通常把主键列设置为自动增长,让数据库维护主键值
- 如果某条记录写入失败,新生成的主键值将会作废
- 主键值可以不连续,手动指定一个值,下一次自增从主键的最大值开始
主键或唯一键冲突时的更新操作,插入否则更新
# 插⼊ID为100,学号为100100的学⽣记录时,报主键冲突
insert into student(id, name, sno) values (100, '赵六', '100100');
ERROR 1062 (23000): Duplicate entry '100' for key 'student.PRIMARY'# 可以使⽤以上语法,如果插⼊时有冲突则更新当前列的值
insert into student(id, name, sno) values (100, '赵六', '100100')on duplicate key update name = '赵六', sno = '100100';# Query OK, 2 rows affected (0.01 sec)
# 两⾏受影响,表⽰删除了原来的记录,⼜新写⼊了⼀条记录
替换,如果存在冲突则替换,不存在冲突则插入
# 写⼊或更新Id为101的记录
replace into student(id, name, sno) values (101, '钱七', '100101');
Query OK, 2 rows affected (0.01 sec) # 受影响两⾏# 写⼊⼀条新数据
REPLACE into student(id, name, sno) values (102, '吴⼋', '100102');
Query OK, 1 row affected (0.01 sec) # 受影响⼀⾏
复合主键:由多个列共同组成的主键,主键是否冲突以多个列的组成进行判定
drop table student;
# 重构学⽣表
create table student (id bigint,name varchar(20),PRIMARY KEY (id, name) # 指定复合主键
);# 插⼊数据
insert into student(id, name) values (1, '张三');
Query OK, 1 row affected (0.01 sec)# 重复插⼊主键冲突,此时主键值由id和name两个列共同决定
insert into student(id, name) values (1, '张三');
ERROR 1062 (23000): Duplicate entry '1-张三' for key 'student.PRIMARY'# 修改id值插⼊成功
insert into student(id, name) values (2, '张三');
Query OK, 1 row affected (0.00 sec)select * from student;
+----+--------+
| id | name |
+----+--------+
| 1 | 张三 |
| 2 | 张三 |
+----+--------+
2 rows in set (0.00 sec)
✏️1.5 FOREIGN KEY 外键约束
foreign key (从表列名) references 主表名(主表列名);
- 外键用于定义主表和从表之间的关系
- 外键约束主定义在从表的列上,主表关联的列必须是主键或唯一约束
- 当定义外键后,要求从表中的外键列数据必须在主表的主键或唯一列存在或为null。
- Key列的值为MUL表示外键约束的列
- 删除主表某条记录时,从表中不能有对该记录的引用
- 删除主表时要先删除从表
✏️1.6 CHECK 约束
在8.0.16开始全面支持CHECK约束,之前的版本会忽略CHECK的定义
重构学生表,有以下要求,年龄不能小于16岁,性别只能是男或女
drop table if exists student;# 加⼊CHECK约束
create table student(id bigint PRIMARY KEY auto_increment, # 设置⾃增主键name varchar(20) not null,age int DEFAULT 18,gender char(1),check (age >= 16),check (gender = '男' or gender = '⼥')
);# 正常插⼊数据
insert into student(name, age, gender) values ('张三', 17, '男'), ('李
四', 19, '⼥');# 插⼊年龄⼩于16岁的记录,失败
insert into student(name, age, gender) values ('张三', 15, '男');
# ERROR 3819 (HY000): Check constraint 'student_chk_1' is violated.# 插⼊性别的值不是男或⼥的记录,失败
insert into student(name, age, gender) values ('张三', 17, '1');
# ERROR 3819 (HY000): Check constraint 'student_chk_2' is violated.
📕2. 数据库设计
关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德
范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式),越高的范式数据库冗余越
小。然而,普遍认为范式越高虽然对数据关系有更好的约束性,但也可能导致数据库IO更繁忙,因此在实际应用中,数据库设计通常只需满足第三范式即可。
✏️2.1 第一范式
定义:数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,对象等非原子数据,在关系型数据库中,每一列都可以用基本数据类型表示,就天然满足第一范式。
反例:

学校是一个对象,可以继续进行拆分,所以不满足第一范式
正例:

学校信息包含在一行中,每一列都不能再进行拆分,此时已满足第一范式
✏️2.2 第二范式
定义:第二范式存在于表中定义了复合主键的情况下,在满足第一范式的基础上,不存在非关键字段对任意候选键的部分函数依赖。第二范式强调的是部分函数依赖,当一张表中的主键只有一列时,天然满足第二范式
候选键:可以唯一标识一行数据的列或列的组合,可以从候选键中选一个或多个当做表的主键
反例:

- 这张表中使用学号+课程名定义复合主键来唯一标识一个学生某门课程的成绩
- 学生是通过学号来确定的,与学生的姓名、年龄和性别和课程没有关系,即学生的信息只依赖学号,不依赖课程名;学分是通过课程来确定的,课程的学分与学生没有关系,即学分只依赖课程名,不依赖学生
- 对于使用复合主键的表,如果一行数据中的有些列只与复合主键中的一个或其中几个列有关系,那么就说他存在部分函数依赖,也就不满足第二范式。(满足第二范式意味着一行中所有的列都必须和复合主键有关系)
正例:

不满足第二范式时可能出现的问题:
- 数据冗余
- 更新异常
- 插入异常
- 删除异常
✏️2.3 第三范式
定义:在满足第二范式的基础上,不存在非关键字段,对任一候选键的传递依赖。
反例:

正例:

✏️2.4 设计过程
- 从现实业务中抽象得到概念类
- 根据E-R图完成SQL语句的编号并创建数据库
- 确定实体与实体之间的关系,并画出E-R画
✏️2.5 实体-关系图
实体-关系图(Entity-Relationship Diagram)简称E-R图,也称作实体联系模型、实体关系模型,是
一种用于描述数据模型的概念图,主要用于数据库设计阶段。
E-R图包含了以下三种基本成分:
• 实体:即数据对象,用矩形框表示,比如用户、学生、班级等。
• 属性:实体的特性,用椭圆形或圆角矩形表示,如学生的姓名、年龄等。
• 关系:实体之间的联系,用菱形框表示,并标明关系的类型,并用直线将相关实体与关系连接起
来。
关系的类型:
-
一对一关系(1 :1)

-
一对多关系(1 :N)

-
多对多关系(N : N)

相关文章:
从入门到精通【 MySQL】 数据库约束与设计
文章目录 📕1. 数据库约束✏️1.1 NOT NULL 非空约束✏️1.2 DEFAULT 默认值约束✏️1.3 UNIQUE 唯一约束✏️1.4 PRIMARY KEY 主键约束✏️1.5 FOREIGN KEY 外键约束✏️1.6 CHECK 约束 📕2. 数据库设计✏️2.1 第一范式✏️2.2 第二范式✏️2.3 第三范…...
使用LLaMAFactory微调Qwen大模型
一、环境配置与工具安装 1. 硬件要求 GPU:至少1块NVIDIA GPU(推荐RTX 4090/A100/H100,显存≥16GB)。内存:≥64GB系统内存。存储:≥100GB硬盘空间用于模型与数据集存储。2. 软件依赖 Python 3.8+:需安装CUDA支持的PyTorch版本(如torch==2.0.1+cu117)。 依赖库:通过以…...
Dubbo 通信流程 - 服务的调用
Dubbo 客户端的使用 在 Dubbo 应用中,往类成员注解 DubboReference,服务启动后便可以调用到远端: Component public class InvokeDemoFacade {AutowiredDubboReferenceprivate DemoFacade demoFacade;public String hello(String name){// …...
【数据结构】哈夫曼树
哈夫曼树 在学习哈夫曼树之前,先了解以下几个概念: 一:**路径长度:**在一棵树中,从一个节点到另一个节点所经过的“边”的数量,被我们称为两个节点之间的路径长度。 二:**树的路径长度…...
HCIP(TCP)(2)
1. TCP三次握手 SYN (同步序列编号) 报文: 客户端发送 SYN 报文,开始建立连接,并初始化序列号。 SYN-ACK (同步序列编号-确认) 报文: 服务器收到 SYN 报文后,回复 SYN-ACK 报文,确认连接请求,并初始化自己的序列号和确…...
VMware Ubuntu 网络配置全攻略:从断网到畅通无阻
一、网络连接模式选择(先搞懂原理) VMware提供三种网络模式,就像手机的不同网络套餐: 模式适用场景特点类比NAT个人上网/新手首选虚拟机共享主机IP,能上网但隐身家用WiFi桥接服务器/需要被局域网访问虚拟机会获得独立…...
基于Web的交互式智能成绩管理系统设计
目录 摘要 绪论 一、应用背景 二、行业发展现状 三、程序开发的重要意义 四、结语 1 代码 2 数据初始化模块 3 界面布局模块 4 核心功能模块 5 可视化子系统 6 扩展功能模块 7 架构设计亮点 功能总结 一、核心数据管理 二、智能分析体系 三、可视化系统 四、扩…...
第 12 章(番外)| Solidity 安全前沿趋势 × 审计生态 × 职业路径规划
🌐 第 12 章(番外)| Solidity 安全前沿趋势 审计生态 职业路径规划 ——做得了审计,也接得了项目,走进 Web3 安全工程师的职业实战地图 ✅ 本章导读 Solidity 安全,不只是代码安全、业务安全、审计安全…...
输出3行3列矩阵的鞍点
【问题描述】在矩阵中,一个数在所在行中是最大值,在所在列中是最小值,则被称为鞍点。任意输入一个3行3列矩阵,请设计程序输出其鞍点。 【输入形式】每行3个数,输入3列 【输出形式】输出所有鞍点;如果没有…...
k8s日志管理
k8s日志管理 k8s查看日志查看集群中不是完全运行状态的pod查看deployment日志查看service日志进入pod的容器内查看日志 管理k8s组件日志kubectl logs查看日志原理 管理k8s应用日志收集k8s日志思路收集标准输出收集容器中日志文件 k8s查看节点状态失败k8s部署prometheus监控 k8s…...
【数据结构】顺序表-元素去重
数据元素 结点定义,复杂数据类型,可用作整体性的管理系统。如果单独研究某些数据,比如只看学号或成绩,那么直接使用int之类的简单数据类型亦可。对应修改:typedef int Elemtype; typedef struct student{ //定义学生…...
物理安全——问答
目录 1、计算机的物理安全包含哪些内容 1. 设备保护 2. 访问控制 3. 电力与环境安全 4. 数据存储保护 5. 硬件防护 6. 监控与审计 7. 灾难恢复与应急响应 8. 拆卸与维修安全 2、物理安全有哪些需要关注的问题 1、计算机的物理安全包含哪些内容 1. 设备保护 防止盗窃&…...
element-plus中,Loading 加载组件的使用
一.基本使用 给一个组件,如:table表格,加上v-loading"true"即可。 举例:复制如下代码。 <template><el-table v-loading"loading" :data"tableData" style"width: 100%"><…...
Mybatis_Plus中的常用注解
目录 1、TableName TableId TableId的type属性 TableField 1、TableName 经过以上的测试,在使用MyBatis-Plus实现基本的CRUD时,我们并没有指定要操作的表,只是在 Mapper接口继承BaseMapper时,设置了泛型User,而操…...
云数据库概念
1.云数据库概念 云数据库是部署和虚拟化在云计算环境中的数据库。云数据库是在云计算的大背景下发展起来的一种新兴的共享基础架构的方法,它极大地增强了数据库的存储能力,消除了人员、硬件、软件的重复配置,让软、硬件升级变得更加容易。云…...
高并发金融系统,“可观测-可追溯-可回滚“的闭环审计体系
一句话总结 在高并发金融系统中,审计方案设计需平衡"观测粒度"与"系统损耗",通过双AOP实现非侵入式采集,三表机制保障操作原子性,最终形成"可观测-可追溯-可回滚"的闭环体系。 业务痛点与需求 在…...
UDP视频传输中的丢包和播放花屏处理方法
在处理UDP视频传输中的丢包和花屏问题时,需要结合编码优化、网络传输策略和接收端纠错技术。以下是分步骤的解决方案: 1. 前向纠错(FEC,Forward Error Correction) 原理:在发送数据时附加冗余包,接收方通过冗余信息恢复丢失的数据包。 实现方法: 使用Reed-Solomon、XO…...
企业内训|DeepSeek技术革命、算力范式重构与场景落地洞察-某头部券商
3月19日北京,TsingtaoAI公司负责人汶生受邀为某证券公司管理层和投资者举办专题培训,围绕《DeepSeek技术革命、算力范式重构与场景落地洞察》主题,系统阐述了当前AI技术演进的核心趋势、算力需求的结构性变革,以及行业应用落地的关…...
K8S学习之基础五十二:k8s配置jenkins
k8s配置jenkins...
VS Code C/C++项目设置launch.json中的environment参数解决支持库路径问题
问题描述 Windows 11 VS Code C/C 开发环境搭建分别写了c和cpp两个示例代码,在运行过程中c代码没有发现问题(可能简单,没有用到太多支持),但使用了stl的cpp代码并没有运行出来,如下图: 出问题…...
怎样解决 Windows 11 上的 DirectX 错误,最新DX 问题解决方法
在使用 Windows 11 操作系统的过程中,大家可能会遇到 DirectX 错误的情况,这可能会给游戏体验、多媒体应用甚至是系统的整体性能带来负面影响。不过别担心,本文将为大家详细介绍如何解决 Windows 11 上的 DirectX 错误,让您的系统…...
Spring AOP中为所有类型通知传递参数的完整示例,包含详细注释和参数传递方式
以下是Spring AOP中为所有类型通知传递参数的完整示例,包含详细注释和参数传递方式: // 1. 目标类(被增强的类) package com.example;public class TargetService {public void doTask(String param) {System.out.println("…...
.net平台C#对于2D/二维点云处理用哪些库?
对于单线激光雷达生成的2D点云数据的处理, 虽然比较简单, 但网上的资料比较少, PCL是避不开的, 但它主要处理的是3D点云, 对2D也可以处理, 但它是C语言的, 如果使用的是C语言开发&#x…...
PH热榜 | 2025-03-30
1. Deepcord 标语:Discord 数据分析:获取指标洞察与受众研究 介绍:Deepcord:为社区建设者提供的Discord分析工具。跟踪超过50万个服务器的指标,发现热门社区,监控竞争对手,找到你的目标受众。…...
STM32H743学习记录
2025/03/30 SRAM速率计算方式 MCU主频 乘以 单片机位数 除以 每个字节的位数(8)即可得出单片机的SRAM速率 如72M主频32位单片机速率 72 * 32 / 8 288 M/s FLASH速率计算方式 FLASH大小 乘以 单片机位数 除以 每个字节位数(8)…...
Open webui的使用
问题 之前本地量化模型管理器ollama的文章,我们知道可以通过ollama来管理本地量化模型,也能够在命令行中与相关模型进行对话。现在我们想要在有个web页面通过浏览器来与本地模型对话。这里我们就使用Open webui作为界面来与本地模型对话。 安装启动 这…...
swagger上传图片请求报错
1.如下是上传图片的接口 ApiOperation(value "WF开卡审核-关店换卡信用卡证明")PostMapping(value "/uploadPhoto/{id}")public Result<?> uploadPhoto(List<MultipartFile> file,PathVariable Long id) {return wfAuditService.uploadPhot…...
STM32单片机的桌面宠物机器人(基于HAL库)
效果 基于STM32单片机的桌面宠物机器人 概要 语音模块:ASR PRO,通过天问block软件烧录语音指令 主控芯片:STM32F103C8T6 使用HAL库 屏幕:0.96寸OLED屏,用来显示表情 4个舵机,用来当作四只腿 底部一个面…...
python 语法篇(一)
目录 1 正则匹配注意点11.1 正则匹配字符串写法1.2 创建re函数(1)re.search()--搜索第一个匹配项(2)re.match() - 从字符串开头匹配(3)re.findall() - 返回所有匹配项的列表(4)re.fi…...
【记录自己第一个github 100星项目】采用flask框架构建一个前端页面,进行OpenManus的调用,对OpenManus生成的文件进行预览。
OpenManus-WebUI...
