一文了解MYSQL三大范式和表约束


Posted in MySQL onApril 03, 2022

? 一,什么是范式

范式简言之就是,数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系。所以建立科学的,规范的的数据库是需要满足一些规范的来优化数据数据存储方式

范式一共有六种,这里主要详细介绍三大范式:
第一范式(1NF),第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了

? 二,三大范式的理解

1,第一范式(确保每列保持原子性)

首先第一范式是最基本的范式,而第一范式的合理遵循要按照系统的需求而定,第一范式也是为了确保每列保持原子性,如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第⼀范式。

例如:某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成⼀个数据库表的字段

一文了解MYSQL三大范式和表约束

2,第二范式(保证每列都和主键相关)

第⼆范式在第⼀范式的基础之上更进⼀层。第⼆范式需要确保数据库表中的每⼀列都和主键相关,而不能只与主键的某⼀部分相关(主要针对联合主键)。也就是说在⼀个数据库表中,⼀个表中只能保存⼀种数据,不可以把多种数据
保存在同⼀张数据库表中

例如:对于一张订单表,应该只包括订单信息,若第一张有数量信息,不符合第二范式,对于订单数量应该单独为一张表

一文了解MYSQL三大范式和表约束

3,第三范式(保证每列和主键直接相关,不能间接相关)

第三范式需要确保数据表中的每⼀列数据都和主键直接相关,而不能间接相关,即满足第二范式前提,如果某一属性依赖于其他非主键属性,而其他非主键属性又依赖于主键,那么这个属性就是间接依赖于主键,这被称作传递依赖于主属性。 解释就是一张表最多只存两层同类型信息

例如:在设计⼀个订单数据表的时候,可以将客户编号作为⼀个外键和订单表建立相应的关系

一文了解MYSQL三大范式和表约束

4,表的关系

(1)一对一

一对一就是⼀个学生对应⼀个学号

一文了解MYSQL三大范式和表约束

(2)一对多

一对多是 ⼀个班级包含多个学生(用两张表表示)

一文了解MYSQL三大范式和表约束

(3)多对多

⼀张表中的⼀条数据可以对应到另⼀张表的多条数据

一文了解MYSQL三大范式和表约束

?三,表的约束有哪些

?1,约束类型

表约束也是为了规范程序员正确使用表的,但表约束是预先设置的,设置之后就对所有插⼊和修改立即生效

⭐ NOT NULL - 指示某列不能存储 NULL 值。
⭐UNIQUE - 保证某列的每行必须有唯一的值。
⭐DEFAULT - 规定没有给列赋值时的默认值。
⭐PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
⭐FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
⭐CHECK - 保证列中的值符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句

一文了解MYSQL三大范式和表约束

?2,表的约束

(1)非空约束:NOT NULL

创建的字段默认是可以为空的

一文了解MYSQL三大范式和表约束

而添加了非空约束之后,设置的字段就不能为空了。

语法

字段名 数据类型 NOT NULL
说明了某列不可以存储空值

(2)主键约束:PRIMARY KEY

主键的特征:

1.主键可以由多个字段或单个字段组成

2. 主键不能为空且唯⼀

3. ⼀个表中只能有⼀个主键

独立主键语法:

语法: 字段 字段类型 primary key
示例:
create table test4(id int primary key,name varchar(250));

一文了解MYSQL三大范式和表约束

独立主键:该主键由一个字段组成,且该主键不能重复
联合主键:多个字段组成的主键,因此字段不能重复
一个主键可以有多个字段,一张表只能有一个主键

联合主键语法:

语法: primary key(字段1,字段2…)

示例:
> create table test5(
id int,
name varchar(250),
primary key(id,name)
);

一文了解MYSQL三大范式和表约束

(3)唯一约束:UNIQUE

唯⼀约束就是对应字段的值是唯⼀的,不能重复,但一个表可以有多个唯一索引

语法:

字段名 数据类型 unique
示例:
CREATE TABLE student_unique (
id INT unique,
name VARCHAR(250)
);

一文了解MYSQL三大范式和表约束

⭐ 唯一约束和主键约束区别(面试常考)

主键约束⼀个表只能有⼀个,⽽唯⼀约束可以有多个
主键约束不能有 null 值,⽽唯⼀约束可以有 null(唯⼀索引可以有多个 null)

(4)外键约束:FOREIGN KEY

外键用于关联其他表的主键或唯⼀键

外键可以插入NULL,多个NULL,若外键指定了值,那这个值一定要有效,有效是这个值在主表存在了

语法:

foreign key (字段名) references 主表(列)

示例:

创建学生表student,⼀个学生对应⼀个班级,⼀个班级对应多个学生。使用id为主键,classes_id为外键,关联班级表id

-- 重新设置学⽣表结构
DROP TABLE IF EXISTS student;
CREATE TABLE student (
id INT PRIMARY KEY auto_increment,
sn INT UNIQUE,
name VARCHAR(250) DEFAULT 'unkown',
qq_mail VARCHAR(250),
classes_id int,
FOREIGN KEY (classes_id) REFERENCES classes(id)
);

(5)默认值约束: DEFAULT

指定id列为主键

-- 重新设置学生表结构
DROP TABLE IF EXISTS student;
CREATE TABLE student (
id INT NOT NULL PRIMARY KEY,
sn INT UNIQUE,
name VARCHAR(20) DEFAULT 'unkown',
qq_mail VARCHAR(20)
);

对于整数类型的主键,常配搭自增长auto_increment来使用。插入数据对应字段不给值时,使用最大值+1

– 主键是 NOT NULL 和 UNIQUE 的结合,可以不用 NOT NULL
id INT PRIMARY KEY auto_increment

总结 

到此这篇关于MYSQL三大范式和表约束的文章就介绍到这了,更多相关MYSQL三大范式和表约束内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL之DML语言
Apr 05 MySQL
MySQL 表空间碎片的概念及相关问题解决
May 07 MySQL
解读MySQL的客户端和服务端协议
May 10 MySQL
MySQL触发器的使用
May 24 MySQL
MySQL 亿级数据导入导出及迁移笔记
Jun 18 MySQL
MySQL中的隐藏列的具体查看
Sep 04 MySQL
MySQL基础快速入门知识总结(附思维导图)
Sep 25 MySQL
一文了解MYSQL三大范式和表约束
Apr 03 MySQL
Mysql调整优化之四种分区方式以及组合分区
Apr 13 MySQL
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
Apr 20 MySQL
MySQL中JOIN连接的基本用法实例
Jun 05 MySQL
MySQL自定义函数及触发器
Aug 05 MySQL
MYSQL优化之数据表碎片整理详解
Innodb存储引擎中的后台线程详解
Apr 03 #MySQL
MySQL磁盘碎片整理实例演示
Mysql使用全文索引(FullText index)的实例代码
Apr 03 #MySQL
一文简单了解MySQL前缀索引
为什么MySQL不建议使用SELECT *
详解MySQL的主键查询为什么这么快
You might like
PHP中使用gettext解决国际化问题的例子(i18n)
2014/06/13 PHP
php中的mongodb select常用操作代码示例
2014/09/06 PHP
php中this关键字用法分析
2016/12/07 PHP
Laravel中获取路由参数Route Parameters的五种方法示例
2017/09/29 PHP
Yii1.1框架实现PHP极光推送消息通知功能
2018/09/06 PHP
Laravel框架运行出错提示RuntimeException No application encryption key has been specified.解决方法
2019/04/02 PHP
PHP使用反向Ajax技术实现在线客服系统详解
2019/07/01 PHP
如何判断鼠标是否在DIV的区域内
2013/11/13 Javascript
如何用JavaScript定义一个类
2014/09/12 Javascript
jQuery控制cookie过期时间的方法
2015/04/07 Javascript
jquery实现简单实用的弹出层效果代码
2015/10/15 Javascript
基于jQuery实现带动画效果超炫酷的弹出对话框(附源码下载)
2016/02/22 Javascript
基于javascript bootstrap实现生日日期联动选择
2016/04/07 Javascript
AngularJS实现动态编译添加到dom中的方法
2016/11/04 Javascript
Nodejs多站点切换Htpps协议详解及简单实例
2017/02/23 NodeJs
JS设计模式之数据访问对象模式的实例讲解
2017/09/30 Javascript
Vue利用路由钩子token过期后跳转到登录页的实例
2017/10/26 Javascript
js 客户端打印html 并且去掉页眉、页脚的实例
2017/11/03 Javascript
详解Vue组件插槽的使用以及调用组件内的方法
2018/11/13 Javascript
Vuex mutitons和actions初使用详解
2019/03/04 Javascript
Vue v-text指令简单使用方法示例
2019/09/19 Javascript
Node.js API详解之 util模块用法实例分析
2020/05/09 Javascript
nuxt.js 在middleware(中间件)中实现路由鉴权操作
2020/11/06 Javascript
[01:48]完美圣典齐天大圣至宝宣传片
2016/12/17 DOTA
Python利用Beautiful Soup模块搜索内容详解
2017/03/29 Python
对numpy中数组元素的统一赋值实例
2018/04/04 Python
python 实现登录网页的操作方法
2018/05/11 Python
用Python批量把文件复制到另一个文件夹的实现方法
2019/08/16 Python
深入浅析Python科学计算库Scipy及安装步骤
2019/10/12 Python
Python random库使用方法及异常处理方案
2020/03/02 Python
CSS3与动画有关的属性transition、animation、transform对比(史上最全版)
2017/08/18 HTML / CSS
Nordgreen手表德国官方网站:丹麦极简主义手表
2019/10/31 全球购物
青年教师培训方案
2014/02/06 职场文书
《会变的花树叶》教学反思
2014/02/10 职场文书
社区工作感言
2014/02/21 职场文书
求职信范文怎么写
2015/03/19 职场文书