【MYSQL中数据库的约束以及表的设计】

news2024/12/28 8:50:25

MYSQL中数据库的约束和表的设计

  • 一、数据库的约束
      • 1.1 NULL约束
      • 1.2 UNIQUE:唯一约束
      • 1.3 DEFAULT:默认值约束
      • 1.4 PRIMARY KEY:主键约束
      • 1.5 FOREIGN KEY :外键约束
      • 1.6 CHECK 约束
  • 二、表的设计
      • 2.1 第一范式(1NF)
      • 2.2 第二范式(2NF)
      • 2.3 第三范式(3NF)

此篇博客希望对你有所帮助,不懂的或有错误的也可在评论区留言,错误必评论必回!!!

一、数据库的约束

1.1 NULL约束

NOT NULL:指定某一列不能存储NULL值

示例:如果那一列需要设置为非空值,那么你就可以使用NOT NULL约束条件

在这里插入图片描述
这里创建了一个测试表test_1,对字段name进行NOT NULL约束,查看表结构,发现字段name是否为null值为no
在这里插入图片描述

1.2 UNIQUE:唯一约束

UNIQUE:保证每一列必须有唯一的值(某个值在这一列中不能重复)
注意:不加约束条件,可能出现这一列值相同的情况

在这里插入图片描述

1.3 DEFAULT:默认值约束

DEFAULT:规定没有给值时为默认值

示例:
在这里插入图片描述
当进插入id列时,name默认值就是咱们所设定的’帅哥’;
但当我们给name插入null值时,又是那种情况呢?
在这里插入图片描述这里会发现手动给字段name列插入null值后,查询出来还是null值。
解释:用户指定视为优先级要高于默认约束条件

1.4 PRIMARY KEY:主键约束

PRIMARY KEY:NOT NULL 和UNIQUE 的综合。确保某列(或两个列多个列结合)有唯一标识,有助于更容易更快速的找到表中的一个特定记录。 主键约束的列既是非空也是唯一的

1.通过NOT NULL和UNIQUE来创建主键
在这里插入图片描述
2.通过PRIMARY KEY来创建主键
在这里插入图片描述

对于主键来说一般还与auto_increment(数据自增)来使用。在MySQL中,AUTO_INCREMENT 是一个属性,用于为表中的新记录自动生成一个唯一的数字。这通常用于主键列,以确保每条记录都有一个唯一的标识符。当你向表中插入新行而没有为 AUTO_INCREMENT 列指定值时,MySQL会自动为该列分配一个比表中当前最大值大1的值。

在这里插入图片描述
但手动插入优先级高于auto_increment。

在这里插入图片描述
注意:一张表中只能有一个主键
在这里插入图片描述

主要原因:
1.唯一性:主键的主要目的是确保表中每一行数据都能被唯一标识。
2.索引效率:主键通常会被数据库系统用作一个或多个索引的基础。这些索引能够极大地提升查询效率,因为它们允许数据库系统快速定位到表中的特定行。如果允许一个表有多个主键,那么每个主键都可能需要建立自己的索引,这不仅会增加存储空间的消耗,还可能降低查询效率,因为数据库系统需要管理多个索引。
3.数据完整性:主键还用于维护数据的完整性。它确保了表中不会存在两行数据具有完全相同的键值。
4.外键作用:主键还经常被用作其他表中外键的基础。外键用于在两个表之间建立关系,确保数据的一致性和完整性。如果允许一个表有多个主键,那么外键的引用就会变得模糊不清,因为不清楚应该引用哪个主键。

但一个主键可以包含多个列****(复合主键)****
在这里插入图片描述
在唯一校验时,只有两个字段的值都相同才判定相同。
在这里插入图片描述
第二条插入语句:虽然名字相同但编号不同,还可以插入成功。第三条:都相同才不能插入成功。

1.5 FOREIGN KEY :外键约束

FOREIGN KEY:保证一个表中的数据匹配另一个表中的值的参照完整性。(外键用于关联其他表的主键或唯一键,通过外键约束保证数据的完整性和关系的正确性)

示例:假设一个数据库中有两个表,表一(test_1)包含学生(id),学生姓名(name),班级编号(class_id);
表二(test_2)包含班级编号(class_id),班级(class);
在这里插入图片描述
表二(test_2)中班级编号(class_id)为主键(主表),表一(test_1)中的班级编号为外键(子表)
在这里插入图片描述
在这里插入图片描述
通过这两组数据插入可以看出,表一插入的班级编号必须是表二班级编号数据中有的,当表一插入的班级编号而表二中没有,则数据则会插入失败!!!

那么插入都有约束,那删除表中的数据以及表?

这里必须先删除子表中的记录,然后才能删除主表中的记录。
在这里插入图片描述

正确步骤:在这里插入图片描述

1.6 CHECK 约束

CHECK:保证列中的值符合指定的条件

示例:
在这里插入图片描述
插入正确or错误的数据:
在这里插入图片描述
因为check约束条件是将字段sex约束的只有两种结果’男’或’女’,当输入的sex不是’男’或’女’时,则报错!!!

二、表的设计

在MySQL中,表的设计是数据库设计的基础,它直接影响到数据库的性能、可维护性和可扩展性。
设计表需要考虑关键点:1. 数据类型选择。2. 主键设计。3. 索引设计。4. 约束设计。5. 范式化。6. 性能考虑。7. 安全性。

设计表的时候需要遵守一些规则,一般我们将这些规则称之为三大范式!!!

什么是范式?

范式描述的是数据关系的模型:一对一关系、一对多关系、多对多关系。
范式分类:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)

2.1 第一范式(1NF)

定义:确保表的每一列都是不可分割的原子项,即表中的每个字段都是最基础的单元,不可再分。

关系型数据库的一个最基本的要求,不满足第一范式就不可以称为关系型数据库。
与表的关系:在设计表时,需要确保每个字段都满足1NF的要求,即字段中的数据项是不可再分的。如果某个字段包含了多个数据项(如地址字段包含了省、市、区等多个信息),则需要将其拆分为多个字段,以满足1NF的要求。

2.2 第二范式(2NF)

定义:在满足第一范式的基础上,非主键列必须完全依赖于主键,而不能只依赖于主键的一部分(针对复合主键)。也就是说一个表中没有复合主键(主键只有一列)那么这种的表天然满足第二范式。

与表的关系:在设计表时,如果存在复合主键,并且表中有非主键列只依赖于主键的一部分,那么就需要将这些非主键列拆分到另一个表中,并通过主键与原始表关联。这样可以确保表中的每列都与主键有完整的关系,满足2NF的要求。

不满足第二范式可能出现的问题:
1.数据冗余:不满足第二范式的表通常会有数据冗余的问题。由于非主属性不完全依赖于主键,而是依赖于主键的一部分,这会导致相同的非主属性信息在表中被多次存储。这不仅浪费存储空间,还可能使得更新数据变得复杂和容易出错;
2.更新异常:由于数据冗余,当需要更新某些信息时,必须确保更新所有相关的行,以保持数据的一致性。如果遗漏了某些行的更新,就会导致数据不一致的问题。例如,如果一个员工的部门信息被改变,但在某些行中未被更新,那么查询该员工所属部门时可能会得到不一致的结果;
3.插入异常:如果表中的数据行依赖于包含冗余信息的另一行,那么当尝试删除那些包含非必要信息(但可能是其他行所依赖的)的行时,可能会导致依赖该行数据的其他行也失去重要信息,进而影响到整个数据表的一致性;
4.删除异常:如果表中的某些行依赖于表中其他行的存在(由于非主属性不完全依赖于主键),那么在插入新记录时可能会遇到障碍。例如,如果表中的一个字段(非主键)依赖于另一个字段的值,而该值尚未在表中出现,那么就无法插入这条新记录,除非先插入一个包含该依赖值的临时记录。

2.3 第三范式(3NF)

定义:第三范式建立在第二范式的基础上,它要求表中的非主键列之间不存在传递依赖关系。即表中的每一列都直接依赖于主键,而不是通过其他非主键列间接依赖于主键。
第三范式可以解决数据冗余、更新异常、插入异常、删除异常等问题。

与表的关系:在设计表时,需要确保非主键列之间不存在传递依赖。如果存在传递依赖(即一个非主键列依赖于另一个非主键列,而另一个非主键列又依赖于主键),那么就需要将这些非主键列拆分到不同的表中,并通过适当的关系连接。这样可以消除表中的传递依赖,进一步减少数据冗余,满足3NF的要求。

设计表的过程:

1.通过需求找出实体。2.确定实体之间的关系。3.根据不同的关系按照固定的方法去创建表。

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

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

相关文章

Python面试宝典第49题:字符串压缩

题目 给你一个字符数组chars ,请使用下述算法进行压缩。 1、从一个空字符串s开始,对于chars中的每组连续重复字符 : (1)如果这一组长度为1 ,则将字符追加到s中。 (2)否则&#xff0c…

易灵思FPGA开发(一)——软件安装

一、资料下载 VF-T20F256-深圳市奥唯思科技有限公司_FPGA图像开发_MIPI (szovs.com) 二、软件安装 安装USB下载器驱动 双击第一个.msi文件进行安装 奥唯思FPGA网盘汇总 (szovs.com) 下载Gtkwave软件

初始MYSQL数据库(5)—— 索引

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: MYSQL 目录 索引的概念 索引选择的数据结构 MySQL中的页的相关知识 索引的分类 主键索引 普通索引 唯一索引 非聚集索引 回表查询…

基于python+django+vue的宠物服务管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的宠…

云原生(Cloud Native)简介及相关技术

云原生(Cloud Native)简介及相关技术 什么是云原生? 云原生(Cloud Native)是一种设计和开发应用程序的方法,旨在充分利用云计算的弹性、可扩展性和分布式架构优势。通过采用微服务架构、容器化、持续集成…

【自动驾驶】决策规划算法(一)决策规划仿真平台搭建 | Matlab + Prescan + Carsim 联合仿真基本操作

写在前面: 🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝 个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。 🔍 本文系 清流君 原创之作&…

Java | Leetcode Java题解之第413题等差数列划分

题目: 题解: class Solution {public int numberOfArithmeticSlices(int[] nums) {int n nums.length;if (n 1) {return 0;}int d nums[0] - nums[1], t 0;int ans 0;// 因为等差数列的长度至少为 3,所以可以从 i2 开始枚举for (int i …

硬件工程师笔试面试——集成电路

目录 17、集成电路 17.1 基础 集成电路实物图 17.1.1 概念 17.1.2 集成电路的发展历程 17.1.3 集成电路的分类 17.1.4 集成电路的制造工艺 17.1.5 集成电路的应用 17.2 相关问题 17.2.1 集成电路的制造工艺中,光刻技术是如何实现的? 17.2.2 在集成电路设计中,如何…

【Python百日进阶-Web开发-FastAPI】Day801 - FastAPI是什么

文章目录 一、官网二、FastAPI是什么三、FastAPI特性3.1 基于开放标准3.2 自动生成文档3.3 更主流的 Python3.4 编辑器支持3.5 简洁3.6 验证3.7 安全性及身份验证3.8 依赖注入3.9 无限制"插件"3.10 测试四、Starlette 特性五、Pydantic 特性六、Python 类型提示简介6…

DERP靶机详解

靶机下载地址 https://www.vulnhub.com/entry/derpnstink-1,221/ 靶机配置 默认是桥接模式,切换为NAT模式后重启靶机 主机发现 arp-scan -l 端口扫描 nmap -sV -A -T4 192.168.229.158 访问网页 http://192.168.229.158/ 目录扫描 python dirsearch.py -u htt…

css边框修饰

一、设置线条样式 通过 border-style 属性设置,可选择的一些属性如下: dotted:点线 dashed:虚线 solid:实线 double:双实线 效果如下: 二、设置边框线宽度 ① 通过 border-width 整体设置…

量化在密集向量检索中的权衡:深入分析索引时间、查询效率与召回效果

在现代信息检索系统中,向量搜索已成为提升检索质量和效率的关键技术。随着数据量的激增,如何高效地处理和检索大规模向量数据集,成为了一个重要课题。最近,我在研究一篇关于密集和稀疏检索器的论文——《Operational Advice for D…

【图像匹配】基于Harris算法的图像匹配,matlab实现

博主简介:matlab图像代码项目合作(扣扣:3249726188) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于基于Harris算法的图像匹配,用matlab实现。 一、案例背景和算法介绍 …

无人机培训机构技术股份合作探讨

随着无人机技术的飞速发展,其在航拍、农业、物流、环境监测、应急救援等多个领域展现出巨大潜力,市场对无人机专业人才的需求急剧增加。鉴于此,多家致力于无人机培训教育的机构决定携手合作,通过技术股份合作模式,共同…

基于RBAC的实验室预约系统中授权模块的研究与实现

博主介绍:专注于Java vue .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的…

kali——foremost的使用

目录 前言 使用方法 前言 foremost工具是一个在Kali Linux中用于数字取证和数据恢复的强大工具。 使用方法 foremost -t all -i 数据包绝对路径修复好的数据包,将会自动保存在output目录里。

7--SpringBoot-后端开发、原理

配置优先级 SpringBoot 项目当中支持的三类配置文件: application.properties application.yml application.yaml 配置文件优先级排名(从高到低): 1. properties配置文件 2. yml配置文件 3. yaml配置文件 在SpringBoot项目当…

Effective C++笔记之二十三:非void函数不写return

一.main函数 Qt Creator查看汇编的步骤如下 上图是g编译器下的汇编 eax就是main()函数的返回值 如果删掉return 0; 可以发现编译器还是把eax的值设为了0,由此可见,即使在main函数中不写return 0,编译器还是会默认添加个return 0。…

Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 垃圾收集器

文章目录 垃圾回收机制Stop-the-World垃圾收集器垃圾收集器分类Serial 收集器Serial Old 收集器ParNew 收集器Parallel Scavenge 收集器Parallel Old 收集器CMS 收集器CMS 收集器缺点 G1 收集器G1 收集器特点G1 收集器的分代理念G1 收集器运作过程 垃圾回收机制 垃圾回收&…

二、Servlet

文章目录 1. Servlet技术1.1 什么是Servlet1.2 手动实现 Servlet 程序1.3 url 地址到 Servlet 程序的访问1.4 Servlet 的生命周期1.5 GET 和 POST 请求的分发1.6 通过继承 HttpServlet 实现 Servlet 程序1.7 使用 IDEA 创建 Servlet 程序1.8 Servlet 类的继承体系 2. ServletCo…