MySQL——约束与表的设计基础

news2024/10/6 16:24:03

·前言

        本篇文章主要介绍数据库约束以及数据库中有关表设计的一些基础知识,文章会尽量都用实例进行直观的讲解与展示每个知识点的意义,现在就开始今天的学习吧!!

一、数据库约束

1.约束概述

        约束,就是在创建表的时候给这个表指定一些规则,在后续插入、修改与删除时都要保证数据能够遵守这些规则,引入这些规则是为了进行更强的数据检查及校验,这是因为数据是非常重要的,所以数据一定要确保正确,规则引入后,再进行插入、修改与删除等操作时,一旦数据不符合规则,就会报错,报错就是把问题提前告诉我们,以免酿成大错。

2.约束类型

约束类型
类型说明
not null指示某列不能储存null值
unique保证某列的每行必须有唯一值
default规定没有给列赋值时的默认值
primary keynot null与unique的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定记录。
foreign key保证一个表中的数据匹配另一个表中的值的参照完整性。

(1)NOT NULL

        创建表时,可以指定某列不为空:

(2)UNIQUE

        指定id列为唯一的、不重复的:

        加上unique约束之后,后续进行插入、修改的时候都会先进行查询,看看当前这个值是否已经存在,从此可以看出,约束能够引入更多的检查操作,同时也会增加系统的开销。 

(3)DEFAULT

        指定插入数据时,当name列为空时默认值是“无名氏”,id列为空时默认值是0:

        默认情况下,默认值就是NULL,进行指定列插入时,其他未被指定的列就会被设置成默认值,由于在很多时候,返回一个NULL值时是一个不好的体验,所以引入DEFAULT约束对NULL的元素默认值加以调整。 

(4)PRIMARY KEY

        指定id列为主键:

        在设置主键的时候,我们往往会使用一个XXX id这样的列作为主键,同时,一个表中只能有一个主键,除了基础的使用之外,还有一种情况是联合主键,就是只有一个主键,这个主键是由多个列联合构成的,在这我就不过多介绍了。

        主键不允许重复,那么具体要怎么做才能保证它不重复呢?在MySQL中,提供了一种机制:“自增主键”,具体用法如下:

        上述的自增主键,只能在单个数据库下生效,如果数据库是由多个MySQL服务器构成的“集群”,此时自增主键就无法生效了,这是因为表中数据特别多的时候,需要多台机器进行储存,此时多台机器的主键就是各自自增各自的了,这就可能导致不同机器中数据的id重复,但实际上我们引入“主键”是不希望会重复的,这时为了确保一个分布式系统中,能够存在唯一id,业界也会有一些分布式系统生成唯一id的算法,当然这类算法有很多,大同小异,基本思路就是将主键设置成字符串类型,然后大致按如下方法:

        时间戳(ms,us)        +         主机编号        +        随机因子

        这里时间戳为了保证不同时刻生成的数据的id是不同的,主机编号是为了在同一时刻生成多个数据时,只要这几个数据是在不同主机上,仍然可以通过主机编号确保不重复,随机因子,预防的就是同一时刻,同一个主机上生成了多个数据,这时候就可以针对这多个数据id再通过随机因子进行区分,当然出现这种情况的数据不会太多,所以也不太会出现重复的情况。

(5)FOREIGN KEY

        外键用于关联其他表的主键唯一键,语法:

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

 

        引入外键约束,就是为了解决上面这种问题,希望学生表中的class_id都要在班级表中存在,此时就可以使用外键约束进行校验,这就要求本表中的这个列的数据必须要在引用的外面的表的对应列中存在,详细介绍与具体使用如下所示:

        这个情况下,可以认为班级表约束了学生表,此时就把班级表这种约束别人的表,称为“父表”(parent table),把学生这种被别人约束的表,称为“子表”(child table),引入外键约束之后,每新增一条记录就会先在对应的父表中进行查询,看看是否存在,如果不存在就会报错。

        其实,外键约束也是一个双向约束,也就是父亲在约束孩子时,孩子也同时约束着父亲,这也就是所谓的言传身教,所以这里子表对父表也有约束的,要想删除父表中某条记录,就必须先删除子表中对应的数据,保证子表中没有数据引用父表这条记录,才能真正执行删除,下面进行演示,详细介绍与具体效果如下:

        在尝试删除或修改父表中的记录,也会先查询子表,看看当前这个结果是否在子表中被引用,如果被引用,就会删除失败。

        使用外键约束的时候,操作子表要查询父表,操作父表也要查询子表,这里就会伴随很多查询操作,如果表中数据非常多,查询操作就会非常低效,为了让上述查询更加高效,往往就需要要求子表中的列和父表中被引用的列,都要带有“索引”,索引可以理解成目录,关于索引的知识,在后续文章会介绍到,下面通过一个简单示例进一步介绍与演示:

二、表的设计

        谈到“数据库设计”,就是根据需求,来把需要的表创建出来(有几个表,每个表中有什么……),设计的一般过程如下:

  1. 先根据需求,找到实体(一些关键性质的对象)
  2. 梳理清楚实体之间的关系

        在梳理清楚需求后提出关键的名字,一般来说,每个实体都要安排一个表,多个实体之间,需要理清楚关系,不同关系下,有不同的设计表的方式,常见关系可分为四种,有一种关系是没有关系,这种就不进行介绍了,所以下面我会进行三种关系的介绍。

1.一对一

        这里我们以学校的教务系统为例,在教务系统中需要表示一个概念,学生(实体),还有一个概念是账号(实体),针对这两个概念可以分别创建两张表:

  1. 学生表:学号,姓名,班级,联系方式,入学时间……
  2. 账号表:账户名,密码,登录地点……

        这里的一对一关系可以这么理解:

一个学生只能有一个账号(学生不能注册小号)

一个账号只能给一个学生使用(一个账号不能多个学生一起使用)

         在一对一的关系下,表结构有以下几种设计方案:

  • 方案一:创建一个大表,把所以信息放在一起,当然,这种方案只适合于当两张表都很简单(列很少)可以考虑合并在一起,如果这两张表都比较复杂(列很多)那就不建议合并了。
  • 方案二:分成两张表,使用id引用过来,建立联系,例:

student(student_id,student_name,account_id);

account(account_id,user_name,password); 

2.一对多

        以教务系统为例,有一个实体学生,还有一个实体班级,同样针对这两个实体可以创建两张表,在这里,一对多的关系可以这么理解:

一个班级可以包含多个学生

一个学生只能属于一个班级

        针对一对多,设计表也存在两种方案:

  •  方案一:如下图,原理就是在班级表中使用一个数组类型字段把班级中学生的学号存在数组中,这样就知道班级中有哪些学生了,这里的问题就在于MySQL中并不支持“数组”这样的类型,所以这个方案这MySQL中行不通。
  • 方案二:如下图,原理就是在学生表中添加一个字段存储班级号,这样一个学生就只对应一个班级,而班级表也不需要存储学生的信息了。

3.多对多

        以教务系统为例,学生是一个实体,课程也是一个实体,同样针对这两个实体可以创建两张表,在这里,多对多的关系可以这么理解:

一个学生可以选择多门课程

一门课程可以被多个学生选择

        这里创建多对多关系时需要引入一个关联表,用于把两张表联系到一起,具体如下:

        通过关联表就可以知道某个同学都选择了哪些课程。

        在设计表时,我们就可以按上面的示例,确定每个实体的关系,然后往里面套,能套上哪个,就用哪种方式创建表。

·尾声

        文章到这里就接要结束了,本篇文章分为两个部分,分别是对约束的介绍,还有对表设计的介绍,对于约束这里我只是简单的介绍了约束的一些基础用法,但实际添加约束还有其他方式,约束的使用也还有很多方式,如果有机会,我会在后续文章继续进行补充,对于表的设计,这里谈到设计,往往是与“经验”有一定关联的,我在这只是对表设计的基础进行了简单的介绍,实际上,关于设计这是一个非常复杂的问题,这需要考虑的东西有很多,原谅博主能力有限只能介绍这么多,如果这篇文章对你有所帮助,希望能多多支持咯,您的支持就是我最大的动力~~~~

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

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

相关文章

leedcode【209】. 长度最小的子数组——Java解法

Problem: 209. 长度最小的子数组 题目思路解题方法复杂度Code效果 题目 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续 子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果不存…

TypeScript-类型注解

TS类型注解 指的是给变量添加类型约束,使变量只能被赋值为约定好的类型,同时可以有相关的类型提示 TS支持的常用类型注解 Js 已有类型 // 简单类型 number string boolean null undefined // 复杂类型 数组 函数 Ts 新增类型 联合类型、类型别名、接…

ColossalAI Open-Sora 1.1 项目技术报告 (视频生成)

项目信息 项目地址:https://github.com/hpcaitech/Open-Sora技术报告: Open-Sora 1:https://github.com/hpcaitech/Open-Sora/blob/main/docs/report_01.mdOpen-Sora 1.1:https://github.com/hpcaitech/Open-Sora/blob/main/docs…

解决移植Metasploitable3到VM虚拟机无网络的问题

第一步 导入后不要开机,先在虚拟机设置里面将原有的两个网络适配器移除。 第二步 接着在选项里面,在客户机操作系统里面,选择Microsoft Windwos(W), 版本选择Windows Server 2008 R2 x64 第三步 先打开虚拟机,然后…

[书生·浦语大模型实战营]——第二节:课后作业

基础作业 1.使用 InternLM2-Chat-1.8B 模型生成 300 字的小故事 2.使用书生浦语 Web 和浦语对话,和书生浦语对话,并找到书生浦语 1 处表现不佳的案例(比如指令遵循表现不佳的案例),提交到问卷。 进阶作业 1.huggingface下载功能学习 pip i…

【C++】异常的详细讲解

前言 C是一门面向对象的语言,和面向过程的C语言有很多不一样的,其中这两种语言对程序错误的处理方式就不一样,通常面向对象是通过抛异常的方式来处理错误,而C语言则是通过返回错误码的方式。 目录 1. C语言处理错误的方式2. C异常…

网络变压器原理与维修视频

如果你在寻找网络变压器原理与维修方面的视频教程,可以在网上找一些优质的资料进行学习。一些国内外知名的教育和科技资源网站,如B站、优酷、YouTube等,都有涉及网络变压器原理和维修的视频教程,你可以在这些网站上进行搜索。 通常…

ant design pro 6.0搭建教程

一、搭建 环境: Node.js 18.16.1 ant design pro 6.0 注意:选择umi3时,使用node.js 18版本的会报错,可以实践一下,这里就不再进行实践了。 umi3需要版本是低于node.js 18的 node下载地址: https://nodejs.…

【bugfix】/usr/local/bin/docker-compose:行1: html: 没有那个文件或目录

前言 在使用 docker-compose 管理容器化应用时,偶尔会遇到一些意想不到的错误,比如当尝试运行 docker-compose 命令时,终端非但没有展示预期的输出,反而出现类似网页错误的信息。这类问题通常与 docker-compose 的安装或配置有关…

虚拟化技术[2]之存储虚拟化

存储虚拟化 存储虚拟化简介存储虚拟化一般模型存储虚拟化实现方式基于主机存储虚拟化基于存储设备存储虚拟化基于网络存储虚拟化 案例分析:VMFSVMFS功能 存储虚拟化简介 存储虚拟化:将存储网络中的各个分散且异构的存储设备按照一定的策略映射成一个统一…

BL121DT网关在智能电网分布式能源管理中的应用钡铼技术协议网关

随着全球能源结构的转型和智能电网技术的飞速发展,分布式能源管理系统在提高能源利用效率、促进可再生能源接入及保障电网稳定运行方面发挥着日益重要的作用。然而,分布式能源系统内设备种类繁多,通信协议各异,如何高效整合这些设…

Modbus TCP转Profinet网关测试配置案例

本案例采用XD-ETHPN20网关做为Modbus TCP通信协议设备与Profinet通信协议设备连接的桥梁。Modbus TCP是一种基于TCP/IP协议的工业通信协议,而Profinet则是用于太网通信的协议。Modbus TCP转Profinet网关可实现这两种不同协议之间的数据交换和传输,极大地…

MySQL索引、视图练习

素材 1.学生表:Student (Sno, Sname, Ssex , Sage, Sdept) 学号,姓名,性别,年龄,所在系 Sno为主键 2.课程表:Course (Cno, Cname,) 课程号,课程名 Cno为主键 3.学生选课表:SC (Sno…

FFMPEG 解码过程初步学习

1. 视频文件解码过程 解码过程 步骤如下: 视频文件(封装格式,MP4/FLV/AVI 等)获取视频格式信息等解复用为Stream 流, 准备解码用的Codec将Stream 流 使用解码器解为Raw 格式针 1.1 音视频格式填充: int…

升级版网创教程wordpress插件自动采集并发布

主要功能: wordpress 插件主题系列支持自动采集并发布。 主要采集: 福缘,中创,冒泡 自动采集各大项目网进行整合发布到自己个人网站 插件话更新,减少网络请求,提升稳定性 代码完美开源 傻瓜式操作,一…

第 398 场 LeetCode 周赛题解

A 特殊数组 I 模拟&#xff1a;遍历数组判断是否是一个特殊数组 class Solution { public:bool isArraySpecial(vector<int>& nums) {int r 0;while (r 1 < nums.size() && nums[r 1] % 2 ! nums[r] % 2)r;return r nums.size() - 1;} };B 特殊数组 I…

Aiseesoft iPhone Unlocker for Mac激活版:一键解锁工具

在数字时代&#xff0c;手机解锁问题时常困扰着我们。Aiseesoft iPhone Unlocker for Mac作为一款专为Mac用户打造的解锁工具&#xff0c;以其简洁易用的界面和强大的功能&#xff0c;成为了解决iPhone解锁问题的最佳选择。 Aiseesoft iPhone Unlocker for Mac激活版下载 Aisee…

Mysql之InnoDB索引

1.索引简介 官网介绍:MySQL :: MySQL 8.0 Reference Manual :: 10.3.1 How MySQL Uses Indexes 索引用于快速查找具有特定列值的行。如果没有索引&#xff0c; MySQL 必须从第一行开始&#xff0c;然后读取整个表以找到相关的行。表越大&#xff0c;花费就越多。如果表中有相关…

java项目之视频网站系统源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的视频网站系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 视频网站系统的主要使用者管…

Java进阶学习笔记15——接口概述

认识接口&#xff1a; Java提供了一个关键字Interface&#xff0c;用这个关键字我们可以定义一个特殊的结构&#xff1a;接口。 接口不能创建对象。 注意&#xff1a;接口不能创建对象&#xff0c;接口是用来被类实现&#xff08;implements&#xff09;的&#xff0c;实现接口…