news 2026/4/29 6:16:39

Mysql注释+范式+外键+高级操作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Mysql注释+范式+外键+高级操作

注释不是指普通的注释,让系统(服务器)自动的去忽略无效代码。真正的注释将一段用来描述字段文件保存到对应的数据表里,用于提示用户当前结构的情况。

SQL注释:让系统忽略

-- :两个中划线和一个空格,行注释,以后所有内容都可以忽略

#:也是单行注释

/**/:块注释
注释关键字:comment

语法:在数据类型之后comment ‘注释内容’;

注意:注释不分语言类型,都是为了方便别人和自己去维护代码。

唯一键
唯一键是一个索引,对应字段里面的数据应该具有唯一性。

存在:一个表主键也是用来保证数据的唯一性(对应的字段),但是一张表只能拥有一个主键,但是其他字段也有可能需要保证数据唯一性,唯一键就是为了解决该问题。

唯一键特点
1.唯一键与主键类似,都是保证当前的数据具有唯一性
2.唯一键不统计数据为空的字段(允许有空字段而且是多个)
3.唯一键在表中可以使用多个

添加唯一键
唯一键关键字:unique key
1.在字段之后使用关键字unique
2.可以在所有的字段只用,使用unique key(字段列表);


3.修改表结构
a)修改字段(modify),在字段之后增加属性unique关键字
b)增加唯一键:add unique key(字段列表)


使用唯一键
如果给唯一键字段添加不唯一的数据,那么就会报错。

唯一键不能修改,只能删除

删除唯一键
alter table 表名 drop index 索引名字;

查看索引名字


删除唯一键


伪主键
关系
自然界中的关系通过数据对应的模式进行分析之后,得出结果:可以大致分为三种,一对一,一堆多,多对多

一对多
一对多与多对一是一个概念,指的是一个实体的某个数据与另外一个实体的多个数据有关联关系。
班级表(一表)
名称 教室 总人数 学科
PHP141115 A814 53 PHP
PHP140925 A806 55 PHP


学生表(多表)
学号 姓名 性别 年龄
Itcast0001 何权森 男 22
Itcast0002 朱红林 男 保密
Itcast0003 詹曼雪 女 保密
Itcast0004 刘星 男 28

将实体间的多对一的关系进行维护:在“多”表中,增加一个字段能够指向“一”表中,唯一字段。
学号 姓名 性别 年龄 班级名称
Itcast0001 何权森 男 22 PHP141115
Itcast0002 朱红林 男 保密 PHP141115
Itcast0003 詹曼雪 女 保密 PHP140925
Itcast0004 刘星 男 28 PHP140925

多对多
一个实体的数据对应另外一个实体的多个数据,另外实体的数据也同样对应当前实体的多个数据。
教师表(多)
姓名 性别 年龄
犬夜叉 男 300
戈薇 女 18

班级表(多)
名称 教室 总人数 学科
PHP141115 A814 53 PHP
PHP140925 A806 55 PHP

犬夜叉:教过PHP141115和PHP140925
PHP141115:被犬夜叉和戈薇教过

解决方案:创建一个中间表,专门用来维护多表之间的对应关系,通常是能够唯一标识出数据的字段(主键)


一对一
一个实体的数据对应另外一个实体的数据,一条对一条
学生表(内部关系)
姓名 性别 年龄 身高 政治面貌 家庭住址 紧急联系人 紧急联系人方式 婚姻情况
张无忌 男 20 175 党员 冰火岛 金毛狮王 吼 未婚
周芷若 女 18 168 共产党 峨眉山 灭绝师太 飞鸽传书 未婚
赵敏 女 18 168 国名党 蒙古 王爷 号角 未婚
宋青书 男 22 178 党员 武当山 周芷若 吹 未婚

为了提升操作的效率会主动的将一张表进行拆分,拆分成两张表:一张经常用于操作,另外一张很少操作。
常用信息
姓名 性别 年龄 身高
张无忌 男 20 175
周芷若 女 18 168
赵敏 女 18 168
宋青书 男 22 178

不常用信息
姓名 政治面貌 家庭住址 紧急联系人 紧急联系人方式 婚姻情况
张无忌 党员 冰火岛 金毛狮王 吼 未婚
周芷若 共产党 峨眉山 灭绝师太 飞鸽传书 未婚
赵敏 国名党 蒙古 王爷 号角 未婚
宋青书 党员 武当山 周芷若 吹 未婚

范式
规范的方式,指的是一套维护数据的方式
范式:Normal Format,简称NF,是数学中的一个概念。是为了解决一个数据之间的联系,同时还要保证数据最简化的内容。

范式一共分为六层:第一范式(1NF),第二范式…第六范式(6NF)
范式的严格程度是逐层递增,要满足后续的范式,必须先满足前面所有的范式。

数据库规范中引入的范式的概念,只引入到三层范式(3NF)。

1NF
第一范式:指数据库中表的设计(字段),字段在使用的过程中,不需要通过额外的方式对数据进行处理(拆分),要保证数据库中的字段必须拿出来就可以直接使用。1NF必须满足原子性。

讲师代课表
讲师 性别 班级 教室 代课时间 代课时间(开始,结束)
李东超 Male php0226 D302 30天 2014-02-27,2014-05-05
李东超 Male php0320 B206 30天 2014-03-21,2014-05-30
马浩洋 Male php0320 B206 15天 2014-06-01,2014-06-20

如果在使用的过程中,需要额外的使用代课的起始时间,需要分别得到起始时间和结束时间。代课时间取出来需要对数据进行拆分,不符号1NF,不具有不可拆分性(原子性)

解决方案:将代课时间拆分成开始时间和结束时间
讲师 性别 班级 教室 代课时间 开始 结束
李东超 Male php0226 D302 30天 2014-02-27 2014-05-05
李东超 Male php0320 B206 30天 2014-03-21 2014-05-30
马浩洋 Male php0320 B206 15天 2014-06-01 2014-06-20

满足第一范式很简单:将数据拆分成最小颗粒存储到数据库即可。

2NF
若要满足第二范式,必须先满足第一范式。
2NF,如果一个数据库中存在一个字段依赖主键的一部分,而不是整个主键。这个时候就存在部分依赖,第二范式不满足,需要解除部分依赖。

讲师带课表
讲师P 性别 班级P 教室 代课时间 开始 结束
李东超 Male php0226 D302 30天 2014-02-27 2014-05-05
李东超 Male php0320 B206 30天 2014-03-21 2014-05-30
马浩洋 Male php0320 B206 15天 2014-06-01 2014-06-20
将主键由讲师和班级共同组建(复合主键),性别只依赖于讲师,教室依赖于班级

班级和性别依赖主键的一部分,存在部分依赖。

解决方案:取消复合主键,额外的增加一个逻辑主键
IDP 讲师 性别 班级 教室 代课时间 开始 结束
1 李东超 Male php0226 D302 30天 2014-02-27 2014-05-05
2 李东超 Male php0320 B206 30天 2014-03-21 2014-05-30
3 马浩洋 Male php0320 B206 15天 2014-06-01 2014-06-20

第二范式:不让表中存在复合主键

3NF
要满足第三范式,必须满足第二范式。

指的是如果一个字段不依赖主键,而是依赖其他的字段的时候,那么就会形成传递依赖。一张表中的所有字段都应该依赖主键,而不是依赖主键以外的其他字段。如果存在依赖主键以外的字段,那就形成了传递依赖。第三范式要求取消传递依赖。

讲师带课表
IDP 讲师 性别 班级 教室 代课时间 开始 结束
1 李东超 Male php0226 D302 30天 2014-02-27 2014-05-05
2 李东超 Male php0320 B206 30天 2014-03-21 2014-05-30
3 马浩洋 Male php0320 B206 15天 2014-06-01 2014-06-20

性别不依赖ID,只依赖讲师,而讲师依赖主键,形成了传递依赖。

解决方案:将形成传递依赖的字段,单独取出来,形成一个新的实体,然后在需要使用新实体的地方使用对应实体表中主键。

因为讲师代课表中不存在字段不依赖主键了,所以就不存在传递依赖。

数据库并没有强制要求数据表设计必须满足三范式。

逆规范化
明知设计不符合三范式,但是有时候会为了提高效率,会刻意的增加数据冗余。
IDP 讲师ID 班级ID 代课时间 开始 结束
1 李东超 10 30天 2014-02-27 2014-05-05
2 李东超 12 30天 2014-03-21 2014-05-30
3 马浩洋 12 15天 2014-06-01 2014-06-20

因为数据查询操作如果跨表的话会影响效率,有时候为了效率会增加必要的数据冗余(牺牲磁盘空间)

逆规范化其实本质是效率与空间利用率的博弈。

外键
外键:外面的键,当前表中的某个字段其实与另外的表中的字段(主键)有一个对应的关系
外键关键字:foreign key,也是一种索引。

创建外键
外键和主键有点类似,但是不一样。

1.在所有的字段之后,指定对应的外键。
foreign key(字段名) references 表名(字段)


外键约束
外键的作用是用来维护两张表之间的关系,关系是用来限制表操作的。
父表(主表):被外键指向的表叫做主表
子表(从表):存在外键字段的表叫子表

1.限制子表数据的插入:子表中的外键字段的值必须事先已经在父表中存在


2.限制父表对数据进行操作:更新和删除,限制指的是对应主键的修改。


修改外键:外键不能被直接修改,应当先删除后新增
删除外键
alter table 表名 drop foreign key 外键名;


新增外键
修改表结构
alter table 表名 add constraint 外键名 foreign key(字段) references 表名(字段);


约束模式
用户可以根据自身的需求对外键采用不同的约束方式
有三种约束模式
严格模式:restrict,严格约束外键对应的表
置空模式:set null,将一个外键对应的字段数据给变成null,当父表数据改变的时候,子表的数据被设置成null
级联模式:cascade,级联操作,当父表数据被改变的时候,子表跟着该表

语法
foreign key(字段) references 表(字段) on delete 约束模式 on upldate 约束模式
通常的约束模式:on update cascade on delete set null


更新父表


删除父表数据


外键条件
1.外键表和被引用的表(父子表)都应该是InnoDB的存储引擎
2.外键字段和被引用的主键字段,必须数据类型完全一致
3.外键的名字必须具有唯一性
4.外键可以在一张表中创建多个
5.如果要使用约束模式:置空模式,必须保证子表对应的外键字段本身允许为空


高级数据操作

新增数据
标准语法
insert into 表名 (字段列表) values(值列表);

蠕虫复制
从一个已有的数据中获取数据,然后将数据插入到对应数据表中。
insert into 表名 (字段列表) select 字段列表 from 表名;


蠕虫复制的作用
1.短时间内迅速增加表中的数据(意义不大),测试数据表的压力
2.从表中去复制数据
a)复制表结构:create table 表名 like 已经存在的表;

b)蠕虫复制数据


主键冲突
主键冲突指的是当数据进行插入操作的时候,如果主键冲突了该怎么办。

解决方案1:如果主键冲突,执行更新操作,没有冲突直接插入
insert into 表名 values (值列表) on duplicate key update 字段 = 值[,字段 = 值]


解决方案2:如果主键冲突,先删除,后新增
replace into 表名 values(值列表);


删除数据
标准语法
delete from 表名 where条件;

高级语法
delete from 表名 where条件 [order by排序] [limit 数值]; -- 排序后删除指定条数数据


truncate语法:清空表包括对应的自动增长:先删除表,后新增表


更新数据
与高级的删除数据一样:利用排序和限制
update 表名 set 字段 =值 where条件 order by字段 limit 数值;

查询数据
标准语法
select 字段列表/* from 表名 where条件;

完整语法
select 选择模式 表达式[字段列表(别名)/*] [from 子句] [where子句] [group by子句] [having子句] [order by子句] [limit子句]

选择模式
选择模式指的是当select查到数据之后,对数据的处理方式:查询全部(默认的all),去重(去掉重复的:记录重复,distinct)
表达式
select指定的要返回数据形式

通常要查询的数据,都是字段列表或者*(全部字段),有时候会因为同时查询多个表而出现字段重名的问题。需要使用字段别名来决绝问题。
语法:字段 [as] 别名
from子句
from子句指 的是数据源

from后面必须接数据源,数据源不一定是一张表

1.from后面可以跟多张表,使用逗号分隔


笛卡尔积没有意义:应当尽量避免。

2.表别名


3.数据源不一定是一张已经存在的表,需要的只是一个二维表的结构。from后面可以跟一个子查询。


4.虚拟表
一个不存在的表:dual,凡是没有数据源的select语句都可以为了保证语法的完整性,而增加from子句,数据源是dual

where子句
where子句用于筛选条件,对数据(记录)进行逐行判断,返回是一个类似布尔的结果。

where原理

只有where操作的时候,是直接在磁盘上对数据进行判断,where之后的所有子句都是对内存中的数据进行操作

补充知识
mysql中没有布尔类型,但是却“支持”布尔类型,是内部会进行数据转换,识别关键字


where判断:返回的结果是布尔类型

比较运算:=,>,>=,<,<=,between 左边较小 and 较大,in,is null/is not null

逻辑运算:&&and和||or,用于多条件联合判断

模糊匹配:like ‘patter’,匹配符:%和_

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 0:08:27

蓝奏云直链解析终极指南:3秒获取高速下载链接

蓝奏云直链解析终极指南&#xff1a;3秒获取高速下载链接 【免费下载链接】LanzouAPI 蓝奏云直链&#xff0c;蓝奏api&#xff0c;蓝奏解析&#xff0c;蓝奏云解析API&#xff0c;蓝奏云带密码解析 项目地址: https://gitcode.com/gh_mirrors/la/LanzouAPI 还在为蓝奏云…

作者头像 李华
网站建设 2026/4/15 0:02:28

郭老师-学历正在失效,能力才是硬通货

学历正在失效&#xff0c;能力才是硬通货 ——AI时代下的知识重构与教育革命“再过10年、20年&#xff0c; 学历将不再是你人生的通行证&#xff0c; 而只是—— 一张过期的地图。”&#x1f33f; 真正的竞争力&#xff0c; 不在于你“知道多少”&#xff0c; 而在于—— 你能否…

作者头像 李华
网站建设 2026/4/16 14:07:53

性能优化:Perfetto查看app启动时间及冷热启动介绍

应用启动时间 用户希望应用能够快速加载并及时响应。启动时间过长的应用无法满足这个期望&#xff0c;并且可能会令用户失望。这种糟糕的体验可能会导致用户在 Play 商店针对您的应用给出很低的评分&#xff0c;甚至完全抛弃您的应用。 本页面提供了有助于优化应用启动时间的…

作者头像 李华
网站建设 2026/4/14 23:56:25

Flutter面试必问:Dart事件循环与异步编程实战解析(附代码示例)

Flutter面试必问&#xff1a;Dart事件循环与异步编程实战解析 在Flutter应用开发中&#xff0c;理解Dart语言的事件循环机制是解决复杂异步问题的关键。许多开发者在面试中常被问到"为什么setState后UI没有立即更新&#xff1f;"或"如何避免Future导致的界面卡顿…

作者头像 李华