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

server/2024/10/20 17:08:23/

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.ppmy.cn/server/118684.html

相关文章

Element UI:初步探索 Vue.js 的高效 UI 框架

Element UI:初步探索 Vue.js 的高效 UI 框架 一 . ElementUI 基本使用1.1 Element 介绍1.2 Element 快速入门1.3 基础布局1.4 容器布局1.5 表单组件1.6 表格组件1.6.1 基础表格1.6.2 带斑马纹表格1.6.3 带边框表格1.6.4 带状态的表格 1.7 导航栏组件讲解 二 . 学生列…

网盘存储如何选择大带宽服务器的智慧指南

网盘存储如何选择大带宽服务器?在数据爆炸的时代,网盘已成为我们日常生活与工作中不可或缺的一部分。无论是个人资料的备份、文件的共享协作,还是企业级的数据管理,网盘都以其便捷性、安全性和可扩展性赢得了广泛的认可。随着数据…

Java多线程3

1.有序性在并发编程中的含义。 有序性在并发编程中指的是在多线程环境下,程序的执行顺序应与单线程情况下保持一致,以避免出现不确定或错误的执行结果。 2.为何需要使用多线程进行程序设计? 使用多线程可以提高程序的效率,利用…

Qt控制开发板的LED

Qt控制开发板的LED 使用开发板的IO接口进行控制是嵌入式中非常重要的一点,就像冯诺依曼原理说的一样,一个计算机最起码要有输入输出吧,我们有了信息的接收和处理,那我们就要有输出。 我们在开发板上一般都是使用开发板的GPIO接口…

【天池比赛】【零基础入门金融风控 Task2赛题理解】实战进行中……20240915更新至2.3.4.3 查看训练集测试集中特征属性只有一值的特征

2.3 代码示例 2.3.1 导入数据分析及可视化过程需要的库 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import datetime import warnings warnings.filterwarnings(ignore) 2.3.2 读取文件 #读取数据时相对路径载入报错时…

mysql 触发器的使用以及利弊

MySQL 触发器的使用 **触发器(Trigger)**是在表的某些事件(如插入、更新、删除)发生时,自动执行的一段 SQL 语句。触发器在 MySQL 数据库中可以用于保证数据的一致性、自动处理一些复杂的逻辑等。 创建触发器 创建插…

基于双向RRT算法的三维空间最优路线规划matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 单向RRT算法 4.2 双向RRT算法 5.完整程序 1.程序功能描述 基于双向RRT(Randomly Exploring Random Trees, 随机探索随机树)算法的三维空间最优路径规划是一种解…

【openGauss】检查工具gs_check,gs_checkperf的应用

1. gs_check (1)检查指定项(以CheckCPU为例) 在执行gs_check -i CheckCPU时如果出现如下报错是因为没有为集群配置过免密,即使当前环境为单机也要求要配置ssh互信,有两种解决办法 办法一:配置…