MySQL的约束和三大范式
一.约束
什么是约束,为什么要用到约束?
约束就是用于创建表时,给对应的字段添加对应的约束
约束的作用就是当我们用insert into时,如果传入的数据有问题,不符合创建表时我们定的规定,这时MySQL就会自动帮我们校验并报错提醒
大致有6个约束
1.not null约束
可以在字段后面添加not null,表示此字段添加值时不能传null
2.unique约束(唯一约束)
可以在字段后面添加unique,这样就不能添加已有的值,即值不能有重复
3.default约束(默认值约束)
可以在字段后面添加default+默认的值,这样子如果采用指定列添加,没有指定的列就会默认使用default后面这个默认的值
注:如果我们手动赋值了null,那么此时会使用null,而不会使用默认的值,因为用户优先级要更高
4.primary key(主键约束)
可以在字段后面添加primary key,就相当于not null和unique的结合,即既不能为空,又不能重复
在primary key后面常常跟auto_increment,表示自增,因为大部分使用primary key的字段都是id之类的数字序号,所以采用自增,这样insert into时就不需要手动添加1,2,3……,如果输入null的话,他也会默认自增
注:这个自增是最大值自增,即如果之前id为1,2,3,100,那么下次insert into时它会默认在100的基础上自增加1,即101
这样看起来是断断续续的,但其实在生产环境下是很常见的,因为我们客户端insert的请求会发送到负载均衡器,而负载均衡器都会为每台服务器都预先分配一区段的主键值,比如DB-A这台服务器对应的主键值为1-10000,DB-B这台服务器对应的主键值为10001-20000,DB-C这台服务器对应的主键值为20001-30000……
还有一个容易忽视的点,如果我们insert into一条记录报错了,那么此时它默认也自增一次,比如之前1,2,3,此时insert into报错了,进行修改后再insert into就变为5了
并且一个表里不允许有两个主键,但是允许一个主键包含多个列(复合主键),那么此时判断唯一校验时,就要看是否所有的列都相同才被判定为相同
5.foreign key(外键约束)
一般用于两个表及其以上,并且当两个表中的字段都有相同的一列字段时使用
添加在创建表的最后一行
foreign key (字段名) references 主表名(列)
字段名是当前创建表(副表)里面的其中一个字段,后面是连接另外一张表(主表)及其对应的字段
简单来说就是如果往副表中insert into的值,如果副表中外键那个字段的值在主表中不存在,那么就会报错
举个例子
现在有两张表student表和class表
student有id, name ,class_id三个字段,class有id,name两个字段
先创建的class表,后创建的student表
在创建student表时,给class_id添加了外键约束:foreign key (class_id) references class(id)
此时student表就是副表,class就是主表
如果class中id的值有1,2,3
则如果给student表里面insert into(1,‘张三’,4)就会报错,因为class_id添加为4,但是class表中id那个字段没有4,只有1,2,3,所以不符合外键约束
外键的用途就像学校中抓违纪,抓到一个同学让报他的班级,他报了个25班,但是学校总共就20个班,所以一看就知道他在谎报
6.check约束
添加在最后,check(约束条件)
相当于给添加的值加了一个判断条件
但是不建议使用,因为check是新出来的一种约束,之前比较老的版本不能使用,也就是说向下兼容性不好,了解即可
二.三大范式
设计表的时候会遵守一些规则,一般我们将这些规则称为三大范式
第一范式:
就是表中的字段不可再分,换而言之,简单判断该表是否符合第一范式,只需要看每一个字段是否能用数据库自带的数据类型表示出来即可,如果能用数据类型表示,即符合第一范式,反之则不符合
第一范式是关系型数据库的一个最基本的要求,不满足第一范式的就不可以称为关系型数据库
而我们使用的MySQL就是关系型数据库,所以我们创建的表时一定要满足第一范式
第二范式:
在满足第一范式的基本上,不存在非关键字段对任意候选键的部分函数依赖(存在复合主键的情况下)
用人话来说,就是里面的其他字段都要与主键强相关,如果一部分字段不与主键强相关,而与另外一个候选键强相关,那么就不满足第二范式
也就是说一个表中没有复合主键,主键只有一列,就天然满足第二范式
解决办法就是将一张表拆分为两张表,这样每一张表就满足第二范式了
如果不满足第二范式可能会出现的问题:
1.数据冗余
里面其他字段都重复出现,造成大量数据冗余
2.更新异常
如果要对某个字段进行更新,则在不满足第二范式的表中,要将所有有关该字段的数据行都要进行更新,万一出现更新错误,导致一部分更新成功,另一部分更新失败,这样就导致同一个字段却有两种不同的值,表现为数据不一致
3.插入异常
有些数据必须要经过某个时间段之后才具有意义,比如期末考试,一名同学选的是MySQL课程,但是还没有考试,那么这条数据到期末考试出成绩之前都是没有意义的
4.删除异常
比如一个年级毕业了,要将同学们的数据进行删除,那么同学对应的课程信息也全部被删除,导致虽然学校课程仍然存在,但是因为删除同学的数据同时删除了课程相关的所有数据,是不好的
第三范式:
在满足第二范式的基础上,不存在非关键字段,对任一候选键存在依赖传递
用人话来说就是两个及以上实体之间在同一张表中不能有一个公共的属性,否则就能通过这一公共属性进行依赖传递了
解决办法也是拆分为多张表,将公共属性从一张表中拆分到多个表中
这样就能解决数据冗余,更新异常,插入异常,删除异常的问题
相关文章:
MySQL的约束和三大范式
一.约束 什么是约束,为什么要用到约束? 约束就是用于创建表时,给对应的字段添加对应的约束 约束的作用就是当我们用insert into时,如果传入的数据有问题,不符合创建表时我们定的规定,这时MySQL就会自动帮…...
Unity网络通信(part7.分包和黏包)
目录 前言 概念 解决方案 具体代码 总结 分包黏包概念 分包 黏包 解决方案概述 前言 在探讨Unity网络通信的深入内容时,分包和黏包问题无疑是其中的关键环节。以下是对Unity网络通信中分包和黏包问题前言部分的详细解读。 概念 在网络通信中,…...
练习题 - DRF 3.x Overviewses 框架概述
Django REST Framework (DRF) 是一个强大的工具,用于构建 Web APIs。作为 Django 框架的扩展,DRF 提供了丰富的功能和简洁的 API,使得开发 RESTful Web 服务变得更加轻松。对于想要在 Django 环境中实现快速且灵活的 API 开发的开发者来说,DRF 是一个非常有吸引力的选择。学…...
Linux 经典面试八股文
快速鉴别十个题 1,你如何描述Linux文件系统的结构? 答案应包括对/, /etc, /var, /home, /bin, /lib, /usr, 和 /tmp等常见目录的功能和用途的描述。 2,在Linux中如何查看和终止正在运行的进程? 期望的答案应涵盖ps, top, htop, …...
Filter和Listener
一、Filter过滤器 1 概念 可以实现拦截功能,对于指定资源的限定进行拦截,替换,同时还可以提高程序的性能。在Web开发时,不同的Web资源中的过滤操作可以放在同一个Filter中完成,这样可以不用多次编写重复代码…...
Go 项目中实现类似 Java Shiro 的权限控制中间件?
序言: 要在 Go 项目中实现类似 Java Shiro 的权限控制中间件,我们可以分为几个步骤来实现用户的菜单访问权限和操作权限控制。以下是一个基本的实现框架步骤: 目录 一、数据库设计 二、中间件实现 三、使用中间件 四、用户权限管理 五…...
【Javascript】-一些原生的网页设计案例
JavaScript 网页设计案例 1. 动态时钟 功能描述:在网页上显示一个动态更新的时钟,包括小时、分钟和秒。实现思路: 使用 setInterval 函数每秒更新时间。获取当前时间并更新页面上的文本。 代码示例:<div id"clock"…...
SpringBoot开发——Spring Boot 3种定时任务方式
文章目录 一、什么是定时任务二、代码示例1、 @Scheduled 定时任务2、多线程定时任务3、基于接口(SchedulingConfigurer)实现动态更改定时任务3.1 数据库中存储cron信息3.2 pom.xml文件中增加mysql依赖3.3 application.yaml文件中增加mysql数据库配置:3.4 创建定时器3.5 启动…...
Flutter鸿蒙next 实现长按录音按钮及动画特效
在 Flutter 中实现长按录音按钮并且添加动画特效,是一个有趣且实用的功能。本文将通过实现一个具有动画效果的长按录音按钮,带领你一步步了解如何使用 Flutter 完成这个任务,并解释每一部分的实现。 一、功能需求 我们需要一个按钮…...
【计网】实现reactor反应堆模型 --- 框架搭建
没有一颗星, 会因为追求梦想而受伤, 当你真心渴望某样东西时, 整个宇宙都会来帮忙。 --- 保罗・戈埃罗 《牧羊少年奇幻之旅》--- 实现Reactor反应堆模型 1 前言2 框架搭建3 准备工作4 Reactor类的设计5 Connection连接接口6 回调方法 1 …...
力扣中等难度热题——长度为K的子数组的能量值
目录 题目链接:3255. 长度为 K 的子数组的能量值 II - 力扣(LeetCode) 题目描述 示例 提示: 解法一:通过连续上升的长度判断 Java写法: C写法: 相比与Java写法的差别 运行时间 时间复杂…...
JSON格式
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人和机器阅读和解析。它基于JavaScript的对象表示法,但被广泛用于多种编程语言。 JSON中的数据类型 字符串(String):用双引…...
O-RAN前传Spilt Option 7-2x
Spilt Option 7-2x 下行比特处理上行比特处理相关文章: Open Fronthaul wrt ORAN 联盟被称为下层拆分(LLS),其目标是提高电信市场的灵活性和竞争力。下层拆分是指无线电单元(RU) 和分布式单元(DU) 之间的拆分。 O-RAN前传接口可以在 eCPRI 上传输。eCPR…...
【GeoJSON在线编辑平台】(2)吸附+删除+挖孔+扩展
前言 在上一篇的基础上继续开发,补充上吸附功能、删除矢量、挖孔功能。 实现 1. 吸附 参考官方案例:Snap Interaction 2. 删除 通过 removeFeature 直接移除选中的要素。 3. 挖孔 首先是引入 Turf.js ,然后通过 mask 方法来实现挖孔的…...
确定图像的熵和各向异性 Halcon entropy_gray 解析
1、图像的熵 1.1 介绍 图像熵(image entropy)是图像“繁忙”程度的估计值,它表示为图像灰度级集合的比特平均数,单位比特/像素,也描述了图像信源的平均信息量。熵指的是体系的混乱程度,对于图像而言&#…...
大数据-214 数据挖掘 机器学习理论 - KMeans Python 实现 算法验证 sklearn n_clusters labels
点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...
算法通关(3) -- kmp算法
KMP算法的原理 从题目引出 有两个字符串s1和s2,判断s1字符串是否包含s2字符串,如果包含返回s1包含s2的最左开头位置,不包含返回-1,如果是按照暴力的方法去匹配,以s1的每个字符作为开头,用s2的整体去匹配,…...
5G网卡network connection: disconnected
日志 5G流程中没有报任何错误,但是重新拿地址了,感觉像是驱动层连接断开了,dmesg中日志如下: [ 1526.558377] ippassthrough:set [ ip10.108.40.47 mask27 ip_net10.108.40.32 router10.108.40.33 dns221.12.1.227 221.12.33.227] br-lan […...
微积分复习笔记 Calculus Volume 1 - 4.9 Newton’s Method
4.9 Newton’s Method - Calculus Volume 1 | OpenStax...
Flutter自定义矩形进度条实现详解
在Flutter应用开发中,进度条是一个常见的UI组件,用于展示任务的完成进度。本文将详细介绍如何实现一个支持动画效果的自定义矩形进度条。 功能特点 支持圆角矩形外观平滑的动画过渡效果可自定义渐变色可配置边框宽度和颜色支持进度更新动画 实现原理 …...
隐私优先的本地数据处理:浏览器Cookie逆向工程解密
隐私优先的本地数据处理:浏览器Cookie逆向工程解密 【免费下载链接】Get-cookies.txt-LOCALLY Get cookies.txt, NEVER send information outside. 项目地址: https://gitcode.com/gh_mirrors/ge/Get-cookies.txt-LOCALLY 🔍 颠覆性认知ÿ…...
Ansys Mechanical|远程点Behavior设置:刚性与柔性选择背后的工程考量
1. 远程点Behavior设置的核心逻辑 在Ansys Mechanical中,远程点(Remote Point)的Behavior设置看似只是一个简单的下拉选项,实则直接影响整个仿真结果的准确性。我见过太多工程师在这里踩坑,包括我自己早期也犯过错误。…...
SAP ECC6 2027年停服倒计时:中小企业主必看的4条务实出路与成本分析
SAP ECC6 2027年停服倒计时:中小企业主必看的4条务实出路与成本分析 当2027年的钟声敲响时,全球数十万家企业将面临一个关键抉择:是继续坚守已有二十年历史的SAP ECC6系统,还是踏上数字化转型的新征程?对于资源有限的中…...
蓝桥杯单片机备赛:AT24C02 EEPROM存储整型数据的完整流程与常见错误分析
蓝桥杯单片机备赛:AT24C02 EEPROM存储整型数据的完整流程与常见错误分析 在蓝桥杯单片机竞赛中,AT24C02 EEPROM模块是必考内容之一。许多选手已经掌握了基本字符型数据的读写操作,但当面对整型数据时,往往会遇到各种问题。本文将深…...
【网络编程】UDP协议
目录 协议格式 特点 1.无连接(Connectionless) 2. 不可靠(Unreliable) 3. 面向报文(Message-Oriented) 常见问题 协议格式 特点 1.无连接(Connectionless) 特点:在…...
基于改进型PCNN的不规则图像自适应分割算法研究
基于改进型PCNN的不规则图像自适应分割算法研究根据论文中的相关内容,以下是使用不同方法解决图像分割问题并进行改进的研究:冯登超等人提出了基于改进型脉冲耦合神经网络(PCNN)的自适应分割算法。他们在原有PCNN模型的基础上对神…...
Netscape 浏览器:互联网时代的先驱者
Netscape 浏览器:互联网时代的先驱者 引言 自互联网诞生以来,浏览器作为连接用户与网络世界的重要工具,见证了互联网的飞速发展。在众多浏览器中,Netscape 浏览器以其创新和引领潮流的特性,成为了互联网时代的先驱者。本文将回顾 Netscape 浏览器的发展历程、技术特点及…...
STM32驱动段码屏实战:手把手教你用HT1621B做个简易电子钟(附完整代码)
STM32与HT1621B打造高精度电子钟:从硬件连接到动态显示全解析 在嵌入式开发领域,能够将理论知识转化为实际项目的能力至关重要。本文将带您完成一个完整的电子钟项目,使用STM32微控制器和HT1621B驱动器来驱动段码液晶屏。不同于简单的驱动演示…...
收藏!小白程序员必看:读懂AI岗位JD,精准投递不陪跑
本文针对AI岗位认知模糊、JD理解困难等问题,为读者提供六步解析法,包括明确岗位性质、了解公司类型、评估薪资水平、硬性条件筛选、分析岗位职责和技能匹配。通过这些步骤,帮助读者精准定位适合自己的AI岗位,避免盲目投递。同时&a…...
[物联网入门实战] 从零搭建C51最小系统:Proteus仿真点亮LED全流程解析
1. 为什么选择C51最小系统入门物联网? 很多刚接触物联网开发的朋友都会遇到一个难题:硬件成本高、调试复杂、学习曲线陡峭。我当年自学嵌入式时,烧坏过好几块开发板,后来发现用Proteus仿真C51最小系统是最稳妥的入门方式。这套组合…...
