2.4 数据库表字段约束

news2024/11/13 9:09:05

一、数据库三大范式

我们构造数据库的时候必须要遵守一定的原则,那这个规则就是范式关系型数据库,一共有六种范式,一般情况下只需要满足第三范式即可。

​第一范式:原子性构造数据库必须遵循一定的规则,这种规则就是范式目前关系型数据库有6中范式,一般情况下,只满足第三范式即可第一范式是数据库的基本要求,不满足这一点就不是关系数据库

​第二范式:唯一性数据表中的每条记录必须是唯一的,为了实现区分,通常要为表加上一个列来存储唯一标识,这个唯一属性被称作主键列

​第三范式:关联性每列都与主键有直接关系,不存在传递依赖

1.1、第一范式:原子性

第一范式是数据库的最基本要求,不满足第一范式就不是关系型数据库了,第一范式要求的是数据的原子性。原子是不可再分的粒子,我们定义数据表的时候,某个字段中的数据也要满足原子性,不可再分。

比如说有这么一条记录,刘娜同学的这个班级信息,是保存在班级这个字段里边的。那他的这个内容是高三年级一班这个数据就不符合原子性,因为数据还能继续拆分成年级和班级两个字段,这么拆分之后,我们检索数据的条件就更加灵活了,比如说我想查找高三年级的所有同学,那就可以根据年级这个字段很轻松的查找到他们。但是现在把年级和班级写在一起,我就不能根据年级去查找数据了。总结来说,数据表的每一列都是不可再分割的基本数据,同一列中不能有多个值,也只也不能存在着重复的属性

1.2、第二范式:唯一性

第二范式要求的是数据的唯一性,也就是说数据表中必须有一个字段,每条记录这个字段的值是不能重复的。

比如说有一个学号是230的同学参加计算机上的模拟考试,比如说2018年7月15号这一天他第一次模拟考试考了58分,于是这个同学觉得不理想,又考了一次果当结果当天的第二次考试成绩还是58分,那么问题就来了,在数据库里边是无法区分这两条记录是重复的还是不重复的?因为两条记录的内容是完全都一样的。为了能区分重复的数据,我们可以给数据表加上一个流水号儿的字段,两次考试的流水号儿是不同的。那么我们在数据库里边就能区分这是两条不同的记录,这个唯一的字段,我就把它称作叫做主键列。

1.3、第三范式:关联性

第三范式也是我们必须要满足的范式,当我们满足了第三范式,意味着同时满足了第一和第二范式,第三范式讲的是关联性,每个字段都必须与主键字段产生直接的关系,非主键字段之间是不能产生直接依赖的。

比如说,有一张表爸爸字段的值叫做陈华,儿子字段的值叫做陈浩,女儿的这个字段的值叫做陈婷婷。如果我拿爸爸字段作为主键,那么儿子字段还有女儿字段,都是依赖于爸爸这个字段的,但是后面两个字段,可就违反了第三范式。女儿的玩具和女儿的衣服是依赖于女儿这个字段的,并不依赖于爸爸这个字段,所以说这张表儿的设计是违反了第三范式。

那么符合第三范式的数据表儿应该这么去设计,原来的一张表儿,应该拆分成两张表儿去设计。比如说爸爸字段,儿子字段,还有女儿字段3个字段组成一张数据表,儿子和女儿字段是依赖于爸爸这个主键字段的。然后再往下就是女儿的玩具,女儿的衣服,还有女儿字段组成另外一张表,那么玩具也好,还是衣服也好,都是依赖于女儿字段的,这样子,两张数据表的设计都是符合第三范式的。

第三范式告诉我们,不相关的字段要拆分到其他的数据表儿里边,表和表之间是可以保持关系的

例如说部门儿信息和员工信息就不应该保存在一张表里边,于是我就定义了部门表还有员工表,部门表,有编号,部门名称,还有电话3个字段组成,后两个字段都是依赖于主键这个字段的,那么员工表有编号、姓名、性别,还有入职日期这样的字段来组成的,那么如果说,想把这个员工还有部门关联在一起的话,因为每一个员工都有自己隶属的部门,那我可以给员工表加上一个新的字段,这个字段就是部门编号,比如说陈浩这个人,他的这个隶属部门儿就是10部门,也就是财务部,这样子就算是我给这个员工表加上了一个部门编号的字段,那你可以想象部门编号字段是不是也依赖于这个员工编号的这个主键字段字段。

二、MySql的字段约束

mysql的这个字段约束一共是有四种,这四种分别是主键约束,非空约束,唯一约束,还有外键约束

约束名称

关键字

描述

主键约束

PRIMARY KWY

字段值唯一,且不能为NULL

非空约束

NOT NULL

字段值不能为NULL

唯一约束

UNIQUE

字段值唯一,且可以为NULL

外键约束

FOREIGN KEY

保持关联数据的逻辑性

2.1 主键约束

主键约束既要求字段不能有null值,又要求数据唯一。mysql操作数字的速度远远超过了字符串,如果我们用数字类型的字段作为主键写入数据的时候,数据库就能非常快速的判断出主键值与已有记录的主键值是否重复。而且拿主键作为检索条件的速度,也是非常快的,所以说我们都会用数字类型作为主键,如果我们自己懒得给记录规定主键值,那么就可以让数据库自动去生成主键值,其实这个原理就是一个计数器而已,在创建数据表儿的时候给主键字段后面加上auto_increment,这样子我们在插入数据的时候就可以不用给主键值了,那么主键值的生成就交给数据库去完成了,那么数据库就是一个计数器。比如说写入第一条数据的时候,那我给这个主键值附上一,第二条数据的话,那就是二,以此类推。

2.2 非空约束

我们在创建数据表的时候,哪一个字段要求有这个非空的数据,那你就在这个字段的后面加上not null就行了,在not null后面儿加上了一个default关键字files,什么意思,就是说我要求非空的时候,你在这个married字段里边填写的什么样的这个数据,这是你的自由,但是如果你不填的话,我又不想为空,怎么办?那我就加上一个默认值的这么一个要求。default后面儿写上了一个false,因为这个字段的类型是布尔,所以说,这个布尔的值只有true和false。这个字段的值,如果你不写的话,那没关系,它不是null,那么我们用files作为这个默认值保存到这个字段里边。

2.3 唯一约束

添加唯一约束也非常的简单,就是在字段后面加上unique这个关键字就行了

接下来我用一个SQL语句演示一下三种约束的使用,比如说create table,创建一个数据表,叫做teacher,然后在写字段之前我要说一下这个表儿的名字,建议各位同学给这个表名前面加上一个前缀儿,就是t_,为什么这么做?是有原因的,在数据库里边有些表儿是真实存在的,有些表并不存在是虚拟表,那这种虚拟表在数据库里边把它叫做while,叫视图的意思。所以说我给这个表名前面加上一个t_或者tb_,就代表说这是一个真实的数据表。如果说这个前缀是v或者vw下划线,那就代表说这个东西是一个虚拟的表示视图,是这个意思

比如说这个id字段是int类型的,然后是unsign的,是无符号的,然后是primary key。希望主键的值是自动生成的,所以加上auto increment,然后再往下就是name这个字段,老师是有名字的类型儿是varchar,差的字符儿最多是20个字符,然后是not null的。再往下就是联系电话,tell类型儿是char类型的,然后11个字符儿是非空的。光是非空还不行,因为电话号码儿是不能重复的,所以这里面我就加上一个unique这个关键字,代表的就是唯一,然后再往下就是婚否那个字段,married,那么婚否这个我用boolean这个类型。那booling这个类型儿会映射成TINYINT,一会儿我们看,然后它的这个值也是not null,但是有这个默认值,default这个默认值是false,默认是未婚

CREATE TABLE t_teacher(
id INT UNIQUE PRIMARY KEY AUTO_INCREMENT,  # 无符号的主键,自动生成
name VARCHAR(20) NOT NULL,  # 名字是20个字符,不为空
tel char(11) NOT NULL UNIQUE,  # 电话是11个字符非空,不能重复
married BOOLEAN NOT NULL DEFAULT FALSE  # 婚否不为空,默认未婚
);

2.4 外键约束

外键约束是用来约束多张表之间关系数据的逻辑关系

比如说部门儿表和员工表,应该是先有部门信息,然后才有使员工的记录,按照逻辑关系的先后,我们把部门表称作是副表,把员工表儿称作是子表。如果说我们把 10 部门儿给删掉了,那么员工表中陈浩这条记录就不符合逻辑了,因为它是属于10部门儿的嘛,所以为了约束数据表之间的关联,数据的逻辑关系,这样就必须要引入外键约束了。

按照逻辑关系是员工表依赖于部门表,所以说我们创建外界约束是写在子表上的,那咱们先看一下附表的创建数据,表的sql语句,这个表叫做t_emp是部门表。字段是部门的编号,部门的名称,还有部门的电话,然后再往下,子表是员工表,叫做t_emp就是employee那个单词的缩写。然后员工的编号,员工的姓名,性别,还有是部门的这个编号,然后再往下是入职的日期,在这里面我们看到了一个新的数据类型,叫做 enum。因为我们是一个枚举的数据类型,也就是说我们可以规定好这个字段的值,然后我们在设置字段值的时候,只能是在这个规定的范围之内挑选一个,然后再往下就是这个foreign key关键字是用来规定外键约束的。


# 创建部门表
CREATE TABLE t_dept(  
  deptno INT UNSIGNED PRIMARY KEY,
  dname VARCHAR(20) NOT NULL UNIQUE,
  tel char(4) UNIQUE
)

# 创建员工表
CREATE TABLE t_emp(
  empno INT UNSIGNED PRIMARY KEY,
  ename VARCHAR(20) NOT NULL,
  sex ENUM("男","女") NOT NULL,  # 枚举性别男女 
  deptno INT UNSIGNED NOT NULL,  # 部门编号不能为空
  hiredate DATE NOT NULL,       # 出生日期,不能为空
  FOREIGN KEY(deptno) REFERENCES t_dept(deptno)  # 外键关联部门表,通过部门编号
);

接下来我们在刚刚创建的员工表和部门表中试填写数据,并保存,如果这时点删除部门记录是删除不了的,因为已经通过部门编号关联员工表了,所以正确的这个删除的办法就是把员工删掉,然后再删除相对应的部门儿,这是可以的

部门表 

员工表

外键约束的闭环问题

因为在多张表之中,如果我们建立了外键约束,一旦形成闭环结构,那么任何一张表儿的数据都是无法删除的,这非常麻烦,比如说a表作为副表,B表作为子表,副表的记录不能先删除,所以a表的数据不能删除,那么子表的数据B表可以删除,但是B表作为副表,C表作为子表,那B表的这个数据又不能删除了。C表的数据可以删除,但是以此类推,如果说F表示子表,C表示父表儿,那C表也不能删除了,然后以此类推,最后推到哪儿?推到D表这,这个D表示父表,这个a表示子表,那么D表不能删除了,所以在这里面一旦形成这个闭环结构以后,那么任何一个数据表的数据都是无法删除的。那我这个数据库就丧失了增删改查的灵活操作了,这肯定是不行的,所以说,我们在创建数据表的时候,一定是要放弃外键约束的。在真实的项目里边,这个数据表上百张都是很正常的,所以说不好哪些表之间的这个外键形成了闭环。

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

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

相关文章

使用集成学习对不同的机器学习方法进行集成

数据入口:数据人才的现场调研 - Heywhale.com 本数据集中有 43 行,19 列,数据集包含如下字段: 首先读取数据: import pandas as pd# 读取Excel文件 data pd.read_excel(数据人才的现场调研.xls)可以输出每一列含有…

供方软件供应链安全保障要求及开源场景对照自评表(下)

国标《信息安全技术 软件供应链安全要求》确立了软件供应链安全目标,规定了软件供应链安全风险管理要求和供需双方的组织管理和供应活动管理安全要求。 开源软件供应链作为软件供应链的一种特殊形式,该国标亦适用于指导开源软件供应链中的供需双方开展组…

C HTML格式解析与生成之gumbo

测试 #include <fstream> #include <iostream> #include <stdlib.h> #include <string>#include "../src/gumbo.h"// 提取纯文本内容 static std::string cleantext(GumboNode* node) {if (node->type GUMBO_NODE_TEXT) {return std::st…

【TabBar嵌套Navigation案例-关于页面 Objective-C语言】

一、关于页面 1.首先,看一下我们的示例程序 点击关于以后,它实际上,跳到的也是SettingController,然后呢,传一个plist,但是,这个Controller里边,又多了一个header,所以,这个里边,我们也是用继承的方式去写,因为其他的页面没有这个header,不是所有的Setting都有he…

数据结构--结构体数组和结构体指针

1.定义结构体数组存储5个学生的信息&#xff1a;姓名&#xff0c;年龄&#xff0c;性别 定义函数实现输入&#xff0c;要求形参使用结构体指针接收 函数实现5个学生年龄排序(注意对年龄排序时&#xff0c;交换的是所有信息) 定义函数实现输出&#xff0c;要求形参使用结构体…

Innovus跑到中途想要更换library怎么办?

有的小伙伴在跑innovus时&#xff0c;可能会碰到library更新等问题。但此时&#xff0c;place已经跑完了&#xff0c;又不想重新跑&#xff0c;怎么办呢&#xff1f; 其实&#xff0c;每次保存的innovus database里面都有专门存放这些数据的文件。我们可以将其中一些setting文件…

VBA技术资料MF197:禁用复制的快捷键

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

Linux内核结构

Linux内核结构 文章目录 Linux内核结构一、Linux内核结构介绍1.1 总体结构&#xff1a;1.2 Linux内核结构框图&#xff1a; 二、图解Linux系统架构三、shell3.1 shell的含义&#xff1a;3.2 shell的作用&#xff1a;3.3 shell的类型&#xff1a;3.4 shell的使用&#xff1a;3.5…

Allow anonymous access to my Azure OpenAI chat bot

题意&#xff1a;允许匿名访问我的 Azure OpenAI 聊天机器人 问题背景&#xff1a; I have an Azure OpenAI chat bot using my own data (I configured an OpenAI resource and chose Deploy as Web App) . Members of my domain can access it by logging in. Now I want it…

2.5 数据库索引机制

我们往数据表里面保存数据记录越来越多&#xff0c;一旦达到上千万条&#xff0c;那怎么提高检索速度就需要认真考虑了。我们打开手机上的APP都希望能快些加载出内容&#xff0c;这里的因素有很多&#xff0c;但是如何减少数据查找的时间是其中的重要一环。索引机制就是提升数据…

【内网渗透】最保姆级的春秋云镜Privilege打靶笔记

目录 flag1 flag2 flag3 flag4 flag1 fscan扫外网 访问./www.zip拿到源码 tools/content-log.php存在任意文件读取 根据提示读到Jenkins初始管理员密码 ./tools/content-log.php?logfile../../../../../../../../../ProgramData/Jenkins/.jenkins/secrets/initialAdminP…

第十一章 【后端】商品分类管理微服务(11.5)——增强响应

11.5 增强响应 在前后端分离的开发模式下,我们一般会统一后端的响应格式,比如自定义 Response 结构,但每个开发者可能会封装各自的 Response 结构,造成不一致,因此我们需要将响应格式统一起来,定义一个统一的标准响应格式。 11.5.1 创建响应模块 新建 yumi-etms-respon…

AJAX Jquery $.get $.post $.getJSON

AJAX AJAX Asynchronous JavaScript and XML (异步的J avascript和XML)。 Ajax $.ajax <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, in…

【Linux进程控制】进程程序替换

目录 进程程序替换 替换函数 看现象 替换原理 多进程替换 exec*函数使用&#xff08;部分&#xff09;&#xff0c;并且认识函数参数的含义 1.execl 2.execv 3.execvp 4.execvpe execlp 和execlpe 替换函数总结 进程程序替换 替换函数 有六种以exec开头的函数&am…

AI大语言模型的全面解读

大语言模型&#xff08;Large Language Models, LLMs&#xff09;无疑是近年来最耀眼的星辰之一。他们以惊人的语言生成能力、上下文理解能力以及对复杂任务的泛化能力&#xff0c;正在深刻改变着自然语言处理&#xff08;NLP&#xff09;乃至整个AI领域的格局。 本文将从专业角…

螺栓与散装物体检测系统源码分享

螺栓与散装物体检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…

代理模式-动态代理

一、代理模式 代理模式:给某一个对象提供一个代理&#xff0c;并由代理对象来控制对真实对象的访问。代理模式是一种结构型设计模式。 代理模式角色分为 3种: Subject(抽象主题角色):定义代理类和真实主题的公共对外方法&#xff0c;通常被设计成接口; RealSubject(真实主题角色…

Flutter 安装,配置,运行第一个app 1

起因&#xff0c; 目的: flutter, 其实几年前&#xff0c;我就写过。 当时纯属是个人兴趣&#xff0c;随意探索。 当时我也写了几篇笔记: 比如这一篇还有这个 flutter&#xff0c;其实不难&#xff0c;比较繁琐&#xff0c;小的知识点很多. flutter&#xff0c; 又是环境配…

如何使用 C# 解决 Cloudflare Turnstile CAPTCHA 挑战

处理 CAPTCHA 挑战的复杂性可能是一项艰巨的任务&#xff0c;尤其是在涉及 Cloudflare 的 Turnstile 时。作为一名经验丰富的开发人员&#xff0c;我多年来遇到了许多 CAPTCHA 系统&#xff0c;但 Cloudflare Turnstile 由于其旨在阻止自动化系统的复杂算法&#xff0c;提出了独…

Mac 搭建仓颉语言开发环境(Cangjie SDK)

文章目录 仓颉编程语言通用版本SDK Beta试用报名仓颉语言文档注册 GitCode登录 GitCode 下载 Cangjie SDK配置环境变量VSCode 插件VSCode 创建项目 仓颉编程语言通用版本SDK Beta试用报名 https://wj.qq.com/s2/14870499/c76f/ 仓颉语言文档 https://developer.huawei.com/c…