MySQL的约束和三大范式

news2024/11/6 2:47:05

一.约束

什么是约束,为什么要用到约束?

约束就是用于创建表时,给对应的字段添加对应的约束

约束的作用就是当我们用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.删除异常

比如一个年级毕业了,要将同学们的数据进行删除,那么同学对应的课程信息也全部被删除,导致虽然学校课程仍然存在,但是因为删除同学的数据同时删除了课程相关的所有数据,是不好的

第三范式:

在满足第二范式的基础上,不存在非关键字段,对任一候选键存在依赖传递

用人话来说就是两个及以上实体之间在同一张表中不能有一个公共的属性,否则就能通过这一公共属性进行依赖传递了

解决办法也是拆分为多张表,将公共属性从一张表中拆分到多个表中

这样就能解决数据冗余,更新异常,插入异常,删除异常的问题

  

 

 

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

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

相关文章

Docker篇(Docker安装)

目录 一、Centos7.x 1. yum 包更新到最新 2. 安装需要的软件包 3. 设置 yum 源为阿里云 4. 安装docker 5. 安装后查看docker版本 6. 设置ustc镜像源 二、CentOS安装Docker 前言 1. 卸载(可选) 2. 安装docker 3. 启动docker 4. 配置镜像加速 …

【c++ gtest】使用谷歌提供的gtest和抖音豆包提供的AI大模型来对代码中的函数进行测试

【c gtest】使用谷歌提供的gtest和抖音豆包提供的AI大模型来对代码中的函数进行测试 下载谷歌提供的c测试库在VsCode中安装抖音AI大模型找到c项目文件夹,使用VsCode和VS进行双开生成gtest代码进行c单例测试 下载谷歌提供的c测试库 在谷歌浏览器搜索github gtest, 第…

google adsense广告费中国收款结算被银行拒解决办法

多年前搞了几个网站,挂了谷歌google adsense广告,不知道不觉到了100美金最低结算,谷歌给我打款,之前是绑定交银银行的。被银行镜内登陆谷歌不合法不合规给拒绝入账,把美金退回了,怎么办? googl…

蓝桥杯 区间移位--二分、枚举

题目 代码 #include <stdio.h> #include <string.h> #include <vector> #include <algorithm> #include <iostream> using namespace std; struct node{ int a,b; }; vector<node> q; bool cmp(node x,node y){ return x.b <…

书生第四期实训营基础岛——L1G1000书生大模型全链路开源体系

书生浦语大模型开源开放体系 书生浦语开源一周年历史 2023.7.6&#xff1a;InternLM-7B开源率先免费商用发布全链条开源工具体系2023.9.20&#xff1a;InternLM-20B开源&#xff0c;开源工具链全线升级2024.1.17&#xff1a;InternLM2开源&#xff0c;性能超最新同量级开源模…

单元测试(Junit)

系统—模块—子模块&#xff0c;子模块中不可分割的程序单元的测试&#xff0c;单元的粒度根据实际情况可能是 类或方法等。 面向对象编程中&#xff0c;最小单元就是方法。 单元测试目的是在集成测试和功能测试之前对系统可测试单元进行逐一检查和验证。 单元测试基本原则 …

MySQL表的增删改查(CRUD3约束)

这次我们开始先不复习嗷&#xff0c;等到把数据表的删除说完咱们统一&#xff0c;总结书写 1.数据表的删除&#xff1a; 语法&#xff1a; 1. 使用 DROP TABLE 语句删除单个表 基本语法&#xff1a;DROP TABLE [IF EXISTS] table_name; table_name是要删除的表的名称。IF EXIS…

go中Println和Printf的区别

Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 go中Println和Printf的区别 package mainimport ( "fmt" )//TIP To run your code, right-click the c…

【系统面试篇】进程和线程类(1)(笔记)——区别、通讯方式、同步、互斥、锁分类

目录 一、问题综述 1. 进程和线程的区别&#xff1f; 2. 进程的状态有哪些&#xff1f; 3. 进程之间的通信方式? &#xff08;1&#xff09;管道 &#xff08;2&#xff09;消息队列 &#xff08;3&#xff09;共享内存 &#xff08;4&#xff09;信号量 &#xff08…

编译安装并刷写高通智能机器人SDK

The Qualcomm Intelligent Robotics Product SDK (QIRP SDK) 高通智能机器SDK基于ROS2进行开发&#xff0c;此SDK适用于高通linux发行版本&#xff0c;QIRPSDK中提供以下内容&#xff1a; ROS 包中用于支持机器人应用程序开发的参考代码 用于评估机器人平台的端到端场景示例集…

网页版五子棋—— WebSocket 协议

目录 前言 一、背景介绍 二、原理解析 1.连接过程&#xff08;握手&#xff09; 2.报文格式 三、代码示例 1.服务端代码 &#xff08;1&#xff09;TestAPI 类 &#xff08;2&#xff09;WebSocketConfig 类 2.客户端代码 3.代码演示 结尾 前言 从本篇文章开始&am…

鸿蒙应用开发:下载功能

鸿蒙系统不断发展&#xff0c;有与安卓、iOS 形成三足鼎立之势&#xff0c;且其在智能手机、智能穿戴、车载、家居等行业领域的应用越来越广泛。作为开发者&#xff0c;如何抓住鸿蒙生态崛起的机遇&#xff0c;解决开发挑战&#xff0c;创造更好的应用体验&#xff1f;欢迎您和…

小白直接冲!BiTCN-BiLSTM-Attention双向时间卷积双向长短期记忆神经网络融合注意力机制多变量回归预测

小白直接冲&#xff01;BiTCN-BiLSTM-Attention双向时间卷积双向长短期记忆神经网络融合注意力机制多变量回归预测 目录 小白直接冲&#xff01;BiTCN-BiLSTM-Attention双向时间卷积双向长短期记忆神经网络融合注意力机制多变量回归预测效果一览基本介绍程序设计参考资料 效果一…

如何绘制产业链图谱?

绘制产业链图谱是一个系统性的工作&#xff0c;涉及到对产业的深入理解和分析。对于一般产业绘制产业图谱的步骤&#xff0c;我们可以参照以下流程&#xff1a; 1.明确目标产业链&#xff1a;确定要分析的产业链&#xff0c;比如新材料、新能源、智能制造等&#xff0c;这通常…

Pycharm,2024最新专业版下载安装配置详细教程!

先来一段官方介绍&#xff0c;PyCharm是一种PythonIDE&#xff0c;带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外&#xff0c;该IDE提供了一些高级功能…

鸿蒙开发——进程模型与进程通信

1、进程模型 ❓ 什么是进程&#xff1f; 进程是一个正在执行的程序的实例。当我们启动一个程序时&#xff0c;操作系统会创建一个进程&#xff0c;分配给它所需的资源&#xff0c;如内存和CPU时间。每个进程至少有一个线程&#xff0c;即执行线程&#xff0c;负责执行程序的指…

SQL server 中 CROSS APPLY的使用

CROSS APPLY 是 SQL Server 中的一个操作符&#xff0c;用于将一个表表达式&#xff08;如子查询、函数等&#xff09;与外部表进行连接。CROSS APPLY 类似于 INNER JOIN&#xff0c;但它允许你在一个查询中多次引用外部表的行&#xff0c;并且可以动态地生成结果集。 基本语法…

xlwings,让excel飞起来!

excel已经成为必不可少的数据处理软件&#xff0c;几乎天天在用。python有很多支持操作excel的第三方库&#xff0c;xlwings是其中一个。 关于xlwings xlwings开源免费&#xff0c;能够非常方便的读写Excel文件中的数据&#xff0c;并且能够进行单元格格式的修改。 xlwings还…

[大模型]Diffusion扩散式生成模型

一、概述 扩散式生成模型相较于GAN网络的对抗式生成模型&#xff0c;有更高的精度&#xff0c;也更符合人类的视觉和审美罗技&#xff0c;且风格化能力更强。现行的所有Diffusion模型都是基于2020年的论文DDPM来实现的。 GAN网络通过使生成器(Generator)生成的模型尽可能的逼近…

十四届蓝桥杯STEMA考试Python真题试卷第二套第五题

来源:十四届蓝桥杯STEMA考试Python真题试卷第二套编程第五题 本题属于迷宫类问题,适合用DFS算法解决,解析中给出了Python中 map() 和列表推导式的应用技巧。最后介绍了DFS算法的两种常见实现方式——递归实现、栈实现,应用场景——迷宫类问题、图的连通性、树的遍历、拓朴排…