MySQL基础探秘(3)

news2025/2/27 13:57:34

前面那篇文章是简单介绍了往数据库中插入数据,以及对数据进行有些改动。

但是,细想下,数据能够无限制,无约束进行插入吗?

emm……显然是不行的,不然数据就乱套了,看起来不美观。

所以要对数据插入进行约束

既然讲到约束,那么来讲讲有些什么吧。

约束

约束类型有以下这些

NOT NULL:指示某列不能存储NULL值

UNIQUE:保证某列的每行必须有唯一的值。

DEFAULT:规定没有给列赋值时的默认值.

PRIMARY KEY:NOT NULL和UNIQUE的结合.确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录.

FOREIGN KEY:保证一个表中的数据匹配到另一个表中的值的参照完整性.

CHECK:保证列中的值符合指定的条件.对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句.

这里对外键进行简单的解释下,

比如,有一个商品表(商品id,商品名字,.........),和一个订单表(订单id,商品id,........).

这时候呢,使用外键后,订单表的商品id必须在商品表的订单id存在.

还有一个check约束也简单解释下

比如一个表中的name,这一行的具体条件为:name='男'or name='女'.

那么插入name的时候,就不能填入其他的,比如猴子什么的.

不幸运的是,MySQL中不支持这样的操作.

ok,那么接下来对这些约束进行一些例子的演示.

例子演示:

NOT NULL

UNIQUE

值得注意的是,为什么unique是如何知道数据重复的呢?

这是因为插入/修改之前,先要进行查询.

DEFAULT

最初的name那一列的默认值null,现在改为了无名.

PRIMARY KEY

这里是体现了主键的非空性

这里提示的报错信息是定义了多个主键,说明了一个表中,只能包含一个主键,体现主键的唯一性.

我们主键要对其字段分配一个唯一的值,那么它是如何分配的呢?

MySQL中提供了一个自动分配主键的方式,称为自增主键

即插入数据时,不指定某行的值,让数据库自动分配

自动添加id的值

这里有一点值得注意的是,如若我们这下手动指定id值,比如插入100,这下子,那么再插入吓一条的时候,它的值变成了101

这是因为,在MySQL中,每个表会记录一个自增主键的最大值,后续进行插入的时候,无论这个最大值的是否存在,都是会根据之前保存的最大值,继续往后分配.

FOREIGN KEY

这个外键涉及到了两个表

演示:

一个表是class

一个表是student

这里以创建学生表的时候,一classid和class表中的id作为关联.

对class表插入三条数据

往学校表插入/更新数据时,classid列要在class存在才会显示插入成功

如若不在,报出以下错误:

意思是外键约束失败,要约束的id值在class表不存在.

值得注意的是,刚才的报错信息中一行 a child row

在这翻译为子表中的行。

class是约束的一方为父表,student为被约束的一方为子表。

那么删除呢?

是否能随意性的删除表中的值呢

很明显失败。

这是因为,父表中的某个记录被子表引用了,此时不能删除/修改父表中的对应记录/

就像是父表约束子表

子表也约束父表。

确保是先删除子表再删除父表

回到刚创建两个表来使用外键的时候,如若class不指定primary key,这样子可行不?

指定外键的时候,后续往子表插入数据,先在父表中查找,因为要保证查找的数据具有唯一性。

所以父表中的id列要给primary key。

讲到这,这里的一些约束算是分享完了。

那么接下来讲下表的设计吧。

表的设计:

表的设计是根据实际场景,梳理清楚,应该创建几个表?每个表都有几列,以及几个表之间都存在一些什么关系。

这是一个比较抽象的过程,同时依赖一定的设计经验。

而基本的切入点,就是:

梳理清楚需求中的“实体”和“关系”

而我们说的实体,可以理解为对象。

去找到一个个的对象,然后进一步的再去梳理出,这里的关键信息有什么。

而这个找对象,是如何操作的呢。

一般来说,就是分析你的需求场景,提取一些“关键的名词”

此外,还得需要确定对象的属性和方法,对象有哪些信息去保存,以及需要对这些信息如何进行加工操作。

等我们确定实体——>找出关键字名词,提出需要用到的信息,

所以,一般几个实体,对应到有几个表,但也是不绝对的。

梳理好实体间的关系,然后根据此关系,需要对表做出一些特殊的设定。

实体关系:

这里有些固定的套路,

比如

一对一的关系:

一个学生对应一个学生账号,

一个学生账号只能被一个学生拥有

比如:

students(studentId,name,accountName,password)

这是一个表做法

两个表

students(studentId,name,accountId)

account(accountId,accountname,password)

实际中,怎么方便怎么来。

一对多的关系:

一个学生属于一个班级,

一个班级有多个学生。

就像是这样。

多对多的关系

一个学生可以学习多门课程,

一门课程可以被多个学生持有

多对多的关系,可以以上图展示出来呢。

ok,那么就先分享到这里。

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

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

相关文章

Axure详细介绍及功能对比,常用版本选择和替代软件分享

Axure是一款专门用于原型设计和交互设计的专业软件,广泛应用于用户界面(UI)和用户体验(UX)设计领域。它的主要功能是帮助产品经理、设计师以及开发人员创建具有互动性的原型,以便展示和测试各种应用、网站或…

CST学习笔记(二)Floquet模式激励设置

CST学习笔记(二)Floquet模式激励设置 在CST中我们常常使用Floquet模式来仿真频率选择表面(FSS)或者超材料等,但是我们设置好Zmax的floquet模式数量后,启动仿真,会发现S参数一栏中有很多我们不想要看的S参数&#xff0…

海南聚广众达电子商务咨询有限公司解锁流量密码

在这个瞬息万变的数字时代,电商行业如同一股不可阻挡的洪流,正以前所未有的速度重塑着商业版图。而在这股浪潮中,抖音电商以其独特的魅力,迅速崛起为一颗璀璨的新星,吸引了无数商家与创业者的目光。海南聚广众达电子商…

【题解】【动态规划01背包问题】—— [NOIP2012 普及组] 摆花

【题解】【动态规划01背包问题】—— [NOIP2012 普及组] 摆花 [NOIP2012 普及组] 摆花题目描述输入格式输出格式输入输出样例输入 #1输出 #1 提示 解法1.二维 d p dp dp1.1.思路解析1.2.AC代码 解法2.一维 d p dp dp2.1.思路解析2.2.AC代码 3.扩展:前缀和优化 [NOIP2012 普及组…

python基础知识(十一)面向过程,面向对象,对象属性,魔法方法,继承,私有权限

目录 面向过程是什么 什么是面向对象? 面向对象的三大特性: 继承 多态 类 对象 self关键字 对象属性 类外面访问属性 类内部获取属性 魔法方法 无参init()方法 有参init()方法 str()方法 del()方法 继承基础 什么是继承 单继承 多继…

Javascript笔试题目(六)

1.如何使用JS实现Promise 对象?请写出具体代码 Promise其实也不难-CSDN博客 Javascript 手写一个Promise_javascript中手写promise ?-CSDN博客 Promise其实也不难-CSDN博客 题目要求我们使用JavaScript实现一个Promise对象。对此我们可以基于Promise/A规范的要求进行实现Prom…

面试-2024年7月16号

面试-2024年7月16号 自我介绍Mysql主从复制是做了一个什么样的集群?在Mysql的使用过程中遇到过哪些问题?mysql迁移具体步骤mysql漏洞修复是怎么做的。mysql的容灾方案(灾备恢复机制)。redis多节点怎么部署的redis的备份与恢复、迁…

电源中的“冷地”和“热地”

最近硬件同事在弄开关电源相关项目,由于其第一次做开关电源,并不懂冷地和热地的区别,出现示波器探头接地夹夹“热地”导致实验室多次跳闸,最严重时把板子给炸了。为了了解冷地和热地的如何辨别以及为什么热地带电这些知识&#xf…

【从零开发Mybatis】引入XNode和XPathParser

引言 在上文,我们发现直接使用 DOM库去解析XML 配置文件,非常复杂,也很不方便,需要编写大量的重复代码来处理 XML 文件的读取和解析,代码可读性以及可维护性相当差,使用起来非常不灵活。 因此&#xff0c…

JavaEE 多线程第二节 (多线程的简单实现Thread/Runable)

1. 创建线程(继承 Thread 类)步骤: 继承 Thread 类: 创建一个类并继承 Thread 类,然后重写 run() 方法,在该方法中写入线程执行的代码 class MyThread extends Thread {Overridepublic void run()…

数据恢复超简单!9 个方法任你选!小白也能轻易恢复数据!

在当今数字化的世界中,数据恢复的重要性日益凸显。无论是工作中的重要文档,还是生活中的珍贵照片和视频,一旦丢失,都可能给我们带来极大的困扰。别担心,下面为大家介绍 9 个超简单的数据恢复方法,让小白也能…

C++基础面试题 | 什么是C++中的运算符重载?

文章目录 回答重点:示例: 运算符重载的基本规则和注意事项: 回答重点: C的运算符重载是指可以为自定义类型(如类或结构体)定义运算符的行为,使其像内置类型一样使用运算符。通过重载运算符&…

它思科技CTO聂玮奇:消除“AI幻觉”,搭建高可靠对话云平台丨数据猿专访

大数据产业创新服务媒体 ——聚焦数据 改变商业 近年来,大模型技术在全球范围内引起了广泛关注和应用热潮。 提到人工智能,很多人会想到它强大的运算能力和广泛的应用场景。如今,语言模型的发展如火如荼,但其中的“幻觉”问题却带…

基于SSM社区医院预约转诊管理系统JAVA|VUE|Springboot计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档(1万字以上)开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统:Window操作系统 2、开发工具:IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

SwiftUI 6.0(iOS 18)自定义容器值(Container Values)让容器布局渐入佳境(上)

概述 我们在之前多篇博文中已经介绍过 SwiftUI 6.0(iOS 18)新增的自定义容器布局机制。现在,如何利用它们对容器内容进行“探囊取物”和“聚沙成塔”,我们已然胸有成竹了。 然而,除了上述鬼工雷斧般的新技巧之外&…

STM32_实验1_建立新工程

1、使用STM32CubeIDE建立一个新工程 1.1选择时钟源为外部晶振时钟。 1.2选择调试方式为 serial wire(串行线)。 1.3配置时钟树. 1.4选择以 c 和 h 文件型式管理工程文件。 1.5生成 hex 可执行文件。(完成后点击锤子) 2.串口输出调…

鸿蒙进入“无人区”:该如何闯关?

按照华为方面的说法,“打造鸿蒙操作系统是三大战役,目前已经完成了底座和体验两大战役,第三大战役则是生态。”生态固然重要,但要让鸿蒙与当今世界主流操作系统抗衡,乃至成为新一代操作系统中的翘楚,其实还…

每个程序员都应该了解的硬件知识

作者:shizhaoyang 在追求高效代码的路上,我们不可避免地会遇到代码的性能瓶颈。为了了解、解释一段代码为什么低效,并尝试改进低效的代码,我们总是要了解硬件的工作原理。于是,我们可能会尝试搜索有关某个架构的介绍、一些优化指南或者阅读一些计算机科学的教科书(如:计…

卡码网KamaCoder 94. 城市间货物运输 I

题目来源:94. 城市间货物运输 I C题解1(来源代码随想录):Bellman_ford 本题是经典的带负权值的单源最短路问题,此时就轮到Bellman_ford登场了。Bellman_ford算法的核心思想是 对所有边进行松弛n-1次操作(…

【 ACM独立出版】第二届通信网络与机器学习国际学术会议(CNML 2024,10月25-27)

官方信息 会议官网:www.cn-ml.org The 2nd International Conference on Communication Networks and Machine Learningwww.cn-ml.org 时间地点:2024年10月25-27日 | 中国-河南-郑州 截稿时间:2024年10日19日 (多轮截稿&#x…