基础章节-01-MySQL数据库服务中级课程

图片

1.00 课程知识章节说明

目前在互联网的实际应用中,各个企业都会比较关注自身网站的数据信息,既要保证数据信息的安全性,同时也要保证数据存储读取效率 并且在特殊的场景下,还要对存储的数据信息进行检索和分析;因此数据库服务业务已经在各行各业应用非常的广泛 对于互联网领域的技术人员,对于数据库服务知识的掌握,也将是在求职时必备的技能,有些时候还会绝对入职的定级和薪资水平。

1.05 数据库服务语句应用(基础)

1.5.1 操作管理语言概述介绍

什么是SQL语句? SQL,英文全称为Structured Quer y Language,中文意思是结构化查询语言(属于编程语言); 它是一种对关系数据库中的数据进行定义和操作的语言,是大多数关系数据库管理系统所支持的工业标准语言。 在使用SQL语句时,也会用到几种常用的标准:SQL 89 / SQL 92 /SQL 99 /SQL 03 在企业实际应用过程,还会根据SQL语言操作的方式,细化为四种类型: DDL Data Definition Language(数据定义语言) 概念介绍: 负责管理数据库的基础数据(不会对表的内容修改),比如增删库、增删表、增删索引、增删用户等; 涉及语句: CREATE(创建)、ALTER(修改)、DROP(删除)等; 关注人群: 运维人员和开发人员都要熟悉。 相关具体的DDL负责的操作行为,可以执行以下命令进行查看:

1
2
mysql> ? Data Definition;
-- 查看获取DDL语言的操作行为

DCL Data Control Language(数据控制语言) 概念介绍: 主要用来定义访问权限和安全级别 涉及语句: GRANT(用户授权)、REVOKE(权限回收)、COMMIT(提交)、ROLLBACK(回滚) 关注人群: 运维人员需要熟练 相关具体的DCL负责的操作行为,可以执行以下命令进行查看:

1
2
mysql> ? Account Management
-- 查看获取DCL语言的操作行为

DML Data Manipulation Language(数据操作语言) 概念介绍: 主要针对数据库里的表里的数据进行操作,用来定义数据库记录(数据); 涉及语句: SELECT(查)、INSERT(增)、DELETE(删)、UPDATE(改) 关注人群: 开发人员要熟练,运维人员熟悉即可 相关具体的DML负责的操作行为,可以执行以下命令进行查看:

1
2
mysql> ? Data Manipulation
-- 查看获取DML语言的操作行为

DQL Data Quer y Language(数据查询语言) 概念介绍: 主要用来查询记录(数据) 涉及语句: SELECT(查) 基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块 关注人群: 运维人员和开发人员都要熟悉。

1.5.2 数据库字符编码设置

在使用数据库服务时,有时在数据库表中输入中文信息条目时,默认经常会遇到字符乱码问题,输入中文信息为什么会出现乱码: 系统字符编码概念解释: 计算机,不能直接存储⽂字,存储的是编码。计算机只能处理⼆进制的数据。a - 对于其它数据,⽐如: 0-9、 a-z、 A-Z,这些字符,我们可以定义⼀套规则来表示。 假如: A-110表示, B-111表示等。 ASCII码:00000000 = 0-255 00000001 a 00000010 b 美国发布的,⽤1个字节(8位⼆进制)来表示⼀个字符,共可以表示2^8=256个字符。 美国的国家语⾔是英语,只要能表示0-9、 a-z、 A-Z、特殊符号。 ANSI编码: 每个国家为了显示本国的语⾔,都对ASCII码进⾏了扩展。 ⽤2个字节(16位⼆进制)来表示⼀个汉字,共可以表示2^16= 65536个汉字。 中国的ANSI编码是GB2312编码(简体),对6763汉字进⾏编码,含600多特殊字符。另外还有GBK(简体)。 ⽇本的ANSI编码是JIS编码。 台湾的ANSI编码是BIG5编码(繁体) GBK: 对GB2312进⾏了扩展,⽤来显示罕⻅的、古汉语的汉字。现在已经收录了2.1万左右。并提供了1890个汉字码 位。 K的含义就是“扩展”。 Unicode编码(统⼀编码): 4个字节 a - 4字节 4k ⽤4个字节(32位⼆进制)来表示⼀个字符,想法不错,但效率太低。例如,字⺟A⽤ASCII表示的话⼀个字节就够, 可⽤Unicode编码的话,得⽤4个字节表示,造成了空间的极⼤浪费。

1
A的Unicode编码是:0000 0000 0000 00000000 0000 0100 0000

UTF-8(Unicode Transform Format)编码: 你 11111100000 好 00000011111 根据字符的不同,选择其编码的⻓度。⽐如:⼀个字符A⽤1个字节表示,⼀个汉字⽤2个字节表示。 毫⽆疑问,开发中,都⽤UTF-8编码吧,准没错。 中⽂能够使⽤的字符集两种: 第⼀种: UTF-8。 UTF-8是国际通⽤字库,⾥⾯涵盖了所有地球上所有⼈类的语⾔⽂字,⽐如阿拉伯⽂、汉 语、⻦语…… 第⼆种: GBK(对GB2312进⾏了扩展)。 gb2312 是国标,是中国的字库,⾥⾯仅涵盖了汉字和⼀些常⽤外 ⽂,⽐如⽇⽂⽚假名,和常⻅的符号。 字库规模: UTF-8(字很全) > gb2312(只有汉字) 大部分情况下,作为中国网民用户在向网站服务端进行数据信息存储时,会经常使用到中文字符信息; 但是由于数据库服务系统默认的字符编码设置问题,会导致在识别存储的中文信息时,出现字符乱码问题; 因此,为了能更准确的识别数据库中的中文字符信息,需要对数据库服务配置文件中的字符编码设置进行调整。 配置修改数据库服务配置文件中的默认字符编码设置: 01 查看获取当前数据库默认字符编码信息:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 查看获取数据库服务可以使用的字符集
mysql > show charset;
+----------+---------------------------------+---------------------------+----------+
| Charset  | Description                        | Default collation        | Maxlen |
+----------+---------------------------------+---------------------------+----------+
| utf8        | UTF-8 Unicode                   | utf8_general_ci          |      3      |
| utf8mb4 | UTF-8 Unicode                   | utf8mb4_0900_ai_ci  |      4      |
+----------+---------------------------------+---------------------------+----------+
-- 一般数据库服务中,常规使用的字符集编码为utf8、utf8mb4
# 查看获取数据库服务默认字符编码
mysql > show variables like "%character%";

图片

默认情况下,数据库存储数据与数据库服务端识别的字符编码均为:utf8mb4编码。

说明:数据库服务最新8.0版本的字符集信息为utf8mb4,早期数据库服务版本字符集编码为latin1; 特殊知识点说明:在数据库服务应用中 utf8和utf8mb4之间有什么区别?

序号区别说明解释说明
01两种字符集的字符存储量不同
utf8最多存储3字节长度字符 张-3字节
utf8mb4最多存储4字节长度字符(表情字符emoji) 张-4字节

说明:企业生产环境中,建议客户端与服务端字符集要统一; 模拟存储中文数据信息数据库中,查看中文字符的显示情况:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 创建新的数据库信息
mysql > create database xiaoq;
Quer y OK, 1 row affected (0.00 sec)
# 常看新的数据库编码
mysql > show create database xiaoq;
+----------+-------------------------------------------------------------------------------------------+
| Database  | Create Database                                                                                              |
+----------+-------------------------------------------------------------------------------------------+
| xiaoq        | CREATE DATABASE `xiaoq` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+-------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
# 创建新的数据库表信息
mysql > use xiaoq;
Database changed
mysql > create table a(name char(10));
Quer y OK, 0 rows affected (0.01 sec)
# 向数据库表中插入数据
mysql > insert into a values("老男孩");
Quer y OK, 1 row affected, 1 warning (0.00 sec)
# 查看数据库中表的信息
mysql > select * from a;
+--------+
| name |
+--------+
| ???     |
+--------+
1 row in set (0.00 sec)

02 编写修改数据库服务配置文件字符编码:

1
2
3
4
5
6
7
8
# 将数据库服务配置文件进行备份
[root@xiaoQ ~]# cp /etc/my.cnf{,.ori}
-- my.cnf是数据库服务配置
# 编辑修改服务配置文件参数信息
[root@xiaoQ ~]# vim /etc/my.cnf
[mysqld]
character-set-server=utf8mb4
-- 设置服务端字符集编码为utf8mb4

03 编写修改数据库客户配置文件字符编码:

1
2
3
4
5
# 编辑修改客户配置文件参数信息
[root@xiaoQ ~]# vim /etc/my.cnf.d/client.cnf
-- client.cnf是客户端配置文件信息
[client]
default-character-set=utf8mb4

04 配置编写完后重启数据库服务进行查看:

1
2
3
4
5
# 重启数据库服务程序
[root@xiaoQ ~]# systemctl restart mariadb
# 进入数据库系统检查
[root@xiaoQ ~]# mysql -uroot -poldboy123
mysql > show variables like "%character%";

图片

模拟存储中文数据信息数据库中,查看中文字符的显示情况:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 创建新的数据库信息
mysql > drop database xiaoq;
mysql > create database xiaoq;
Quer y OK, 1 row affected (0.00 sec)
# 常看新的数据库编码
mysql > show create database xiaoq;
+----------+-------------------------------------------------------------------------------------------+
| Database  | Create Database                                                                                              |
+----------+-------------------------------------------------------------------------------------------+
| xiaoq        | CREATE DATABASE `xiaoq` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
+----------+-------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
# 创建新的数据库表信息
mysql > use xiaoq;
Database changed
mysql > create table a(name char(10));
Quer y OK, 0 rows affected (0.01 sec)
# 向数据库表中插入数据
mysql > insert into a values("老男孩");
Quer y OK, 1 row affected, 1 warning (0.00 sec)
# 查看数据库中表的信息
mysql > select * from a;
+--------+
| name |
+--------+
| 老男孩  |
+--------+
1 row in set (0.00 sec)

数据库服务建库时单独设置字符集:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 创建数据库时单独设置字符集,默认后续库中创建的表也是这个字符集,存在库表的继承关系
mysql > create database xiaoQ charset utf8
# 查看创建的数据库字符集信息
mysql> show create database xiaoQ;
+------------+-----------------------------------------------------------------------------------------------------------------+
| Database | Create Database                                                                                                                              |
+------------+-----------------------------------------------------------------------------------------------------------------+
| xiaoQ       | CREATE DATABASE `xiaoQ` /*!40100 DEFAULT CHARACTER SET utf8 */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+------------+-----------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

数据库服务建表时单独设置字符集:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 创建数据库中表时单独设置字符集
mysql> use xiaoQ;
mysql> create table t1 (id int) charset gbk;
# 查看创建的数据表字符集信息
mysql> show create table t1;
+-------+-------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                             |
+-------+-------------------------------------------------------------------------------------------------------------+
| t1       | CREATE TABLE `t1` (`id` int DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=gbk |
+-------+-------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

数据库服务字符编码信息调整方法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 假设数据库表原有字符集为gbk,并且已经存储数据了,需要将表和数据字符集进行调整转换utf8mb4
# 方法一:
mysql > alter table t1 charset utf8mb4;
-- 不严谨的方法,只会影响之后存储的数据,不会修改之前存储的数据
# 方法二:
·锁表逻辑导出数据(例如:mysqldump)
·重新创建数据空表(设置目标字符集)
·导入备份数据信息
-- 严谨的方法,可以影响之后存储的数据,也会修改之前存储的数据
-- 字符集转换是可以的,但是必须保证修改后的字符集是修改前的严格超集(包含)

数据库中字符设置参数信息说明:

序号参数信息解释说明
01character_set_client用来设置客户端使用的字符集
用来设置连接数据库时的字符集
02character_set_connection
如果程序中没有指明连接数据库使用的字符集类型则按照这个字符集设置。
用来设置默认创建数据库的编码格式
03character_set_database
如果在创建数据库时没有设置编码格式,就按照这个格式设置。
文件系统的编码格式,把操作系统上的文件名转化成此字符集
04character_set_filesystem
即把 character_set_client转换character_set_filesystem, 默认binar y是不做任何转换
05character_set_results数据库给客户端返回时使用的编码格式,如果没有指明,使用服务器默认的编码格式。
character_set_server
06服务器安装时指定的默认编码格式,这个变量建议由系统自己管理,不要人为定义。
数据库系统使用的编码格式,这个值一直是utf8
07character_set_system
不需要设置,它是为存储系统元数据的编码格式。
08character_sets_dir这个变量是字符集安装的目录。

根据客户端请求数据库服务端字符集转换流程,可以更好的理解以上字符编码配置参数: 01 mysql Server收到请求时将请求数据从 character_set_client 转换为 character_set_connection; 02 进行内部操作前将请求数据从 character_set_connection 转换为内部操作字符集; 使用每个数据字段的 CHARACTER SET 设定值; 若上述值不存在,则使用对应数据表的字符集设定值; 若上述值不存在,则使用对应数据库的字符集设定值; 若上述值不存在,则使用 character_set_server 设定值; 03 最后将操作结果从内部操作字符集转换为 character_set_results

图片

字符编码校对规则(排序规则): 在进行字符编码设置时,还需要设置校对规则信息,校对规则是什么? 排序规则,就是指字符比较时按照字符编码还是直接用二进制数据比较,以及是否区分大小写。 主要可以根据校对规则定义或设置的不同:在查询数据信息时,影响数据信息的查询输出和排序效果; 其中utf8mb4字符集中,常用的排序规则有utf8mb4_unicode_ci、utf8mb4_general_ci、utf8mb4_bin: 排序规则前缀是字符集编码,中间是排序规则名称,后缀有特殊意义如下(常用的):

排序规则后缀解释说明
_ci不区分大小写,Case-insensitive的缩写
_cs区分大小写,Case-sensitive的缩写
_ai不区分重音,Accent-insensitive的缩写
_as区分重音,Accent-sensitive的缩写
_bin采用二进制方式存储数据信息

utf8mb4_unicode_ci是基于标准Unicode来排序和比较,能够在各种语言之间精确排序。且在特殊情况下,Unicode排序规则为了能够处理特殊字符的情况,实现了略微复杂的排序算法。但是 在绝大多数情况下不会发生此类复杂比较。 utf8mb4_general_ci没有实现Unicode排序规则,在遇到某些特殊字符情况下,排序结果可能不一致。但是,在绝大多数情况下,这些特殊字符的顺序并不需要那么精确。 utf8mb4_bin将字符串的每个字符用二进制数据编译存储,区分大小写,而且可以存二进制的内容。 综合来说,utf8mb4_unicode_ci比较准确,utf8mb4_general_ci速度较快。utf8mb4_unicode_ci对于特殊字符的处理,在中文、英文应用中不会使用到,除非你的应用有德语、法语、俄语 等,则需要使用utf8mb4_unicode_ci,否则一般选用utf8mb4_general_ci就可以了。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 查看数据库服务中可用的校对规则信息
mysql> show collation;
+----------------------------+------------+------+----------+-------------+-----------+------------------+
| Collation                        | Charset   | Id    | Default | Compiled | Sortlen   | Pad_attribute |
+----------------------------+------------+------+----------+-------------+-----------+------------------+
| utf8mb4_0900_ai_ci     | utf8mb4  | 255 | Yes        | Yes            |            0   | NO PAD            |
| utf8mb4_0900_bin        | utf8mb4  | 309 |              | Yes            |            1   | NO PAD            |
# 设置数据库服务中可用的校对规则信息
mysql> create database xiaoA charset utf8 collate utf8_general_mysql500_ci;
mysql> show create database xiaoA;
+----------+------------------------------------------------------------------------------------------------------------------------------------+
| Database | Create Database                                                                                                                    |
+----------+------------------------------------------------------------------------------------------------------------------------------------+
| xiaoA    | CREATE DATABASE `xiaoA` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_mysql500_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+----------+------------------------------------------------------------------------------------------------------------------------------------+
--- 数据库设置字符编码校对规则
mysql> use xiaoA;
Database changed
mysql> create table t1 (id int) charset utf8 collate utf8_german2_ci;
Quer y OK, 0 rows affected, 2 warnings (0.02 sec)
mysql> show create table t1;
+-------+-------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                |
+-------+-------------------------------------------------------------------------------------------------------------+
| t1    | CREATE TABLE `t1` (
`id` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_german2_ci |
+-------+-------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
--- 数据表设置字符编码校对规则

数据库校对规则设置应用实践: 创建三个数据表,并设置相同的字符集,以及不同的字符校对规则;

1
2
3
4
5
6
mysql> create table t1(info char(3)) charset utf8mb4 collate utf8mb4_0900_ai_ci;
Quer y OK, 0 rows affected (0.04 sec)
mysql> create table t2(info char(3)) charset utf8mb4 collate utf8mb4_0900_as_cs;
Quer y OK, 0 rows affected (0.06 sec)
mysql> create table t3(info char(3)) charset utf8mb4 collate utf8mb4_bin;
Quer y OK, 0 rows affected (0.12 sec)

向两个表中插入相同的数据,并进行数据查询操作:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# 插入数据信息
mysql> insert into t1 values('a'),('A'),('b'),('B'),('c'),('C');
mysql> insert into t2 values('a'),('A'),('b'),('B'),('c'),('C');
mysql> insert into t3 values('a'),('A'),('b'),('B'),('c'),('C');
# 查询数据信息
mysql> select * from t1 where info='a';
+------+
| info |
+------+
| a    |
| A    |
+------+
2 rows in set (0.00 sec)
mysql> select * from t2 where info='a';
+------+
| info |
+------+
| a    |
+------+
1 row in set (0.00 sec)
mysql> select * from t3 where info='a';
+------+
| info |
+------+
| a    |
+------+
1 row in set (0.00 sec)
-- 校对规则不同,查询的数据结果会区分大小写显示
mysql> select * from t1 order by info;
+------+
| info |
+------+
| a    |
| A    |
| b    |
| B    |
| c    |
| C    |
+------+
6 rows in set (0.00 sec)
mysql> select * from t2 order by info;
+------+
| info |
+------+
| a    |
| A    |
| b    |
| B    |
| c    |
| C    |
+------+
6 rows in set (0.00 sec)
mysql> select * from t3 order by info;
+------+
| info |
+------+
| A    |
| B    |
| C    |
| a    |
| b    |
| c    |
+------+
6 rows in set (0.00 sec)
-- 校对规则不同,查询的数据结果会有不同的排序效果

1.5.3 数据库数据类型介绍

数据类型从数据存储底层机制来看,主要和内存中如何存储数据信息有关; 在数据库服务中,每一个常量、变量和参数都有数据类型,数据类型用来指定数据的存储格式、约束和有效范围

序号类型类型细化说明
01数字类型
整型(数字/整数)int普通整型数字
tinyint微小整型数字
bigint超大整型数字
浮点(数字/小数)float单精度浮点数
double双精度浮点数
decimal定点数
02字符串类型
字符(字符/符号/整数)char(8)定长字符类型
varchar(8)变长字符类型
enum枚举类型
set集合类型
text大文本类型
03时间类型
date日期类型
time时间类型
datetime日期时间类型(1000~9999)占8字节
timestamp时间戳类型(1970~2038)格林威治时间 占4字节
04二进制类型
05json类型

数据类型区别分析:

类别数据类型细分差异区别
整数类型tinyint占用1字节 有符号取值 -128~127 无符号取值 0 ~ 255(最大3位数)
int占用4字节 有符号取值 -2147483648 ~ 2147483647 无符号取值 0 ~ 4294967295(最大10位数)
BIGINT占用8字节 … 0~2^64-1(最大20位数)

说明:9位数是亿,10位数是十亿,13位数是万亿,14位数是兆,19位数是万兆,20位数是京; 字符类型区别分析:

类别数据类型细分差异区别
字符类型char(n)表示定长的字符串类型,n表示可以存储字符的字节上限(n取值 0~255)
varchar(n)表示变长的字符串类型,n表示可以存储字符的字节上限(n取值 0~65535)

详细的数据类型知识参考链接:https://m.php.cn/article/460317.html 数据类型约束与属性: 在数据库服务中进行数据存储时,类似于在一个execl表中存储数据一样,如果没有对表的字段进行约束和限制,是可以随意存储数据的; 但是,在数据表的某些字段上,是有特殊含义的,如果随意进行存储数据,会造成存储信息的混乱,因此引入了约束与属性概念; 通过数据类型设置的约束与属性,可以让数据库服务限制人类录入的数据信息,从而避免录入数据信息混乱的局面; 并且,通过数据类型的约束与属性设置,还可以避免数据信息输入的重复与输入数据信息不能为空; 常见的约束定义:

序号约束方法解释说明
01PK(primary key)表示主键约束,非空且唯一(表中只能有一个主键)
02UK(unique key)表示唯一约束
03NN(not null)表示非空约束
04FK(foreign key)表示外键约束,多表之间关联使用

常见的属性定义:

序号属性信息解释说明
01default设定默认数据信息,可以实现自动填充
02auto_increment设定数值信息自增,可以实现数值编号自增填充(一般配合主键使用)
02comment设定数据注释信息
03unsigned设定数值信息非负,可以实现数值信息列不能出现负数信息

外键应用补充说明: 外键也称之为外键约束: foreign key 外键: 外面的键, 一张表的一个字段(非主键)指向另外一个表的主键, 那么该字段就称之为外键. 外键所在的表称之为子表(附表); 外键所指向的主键所在的表称之为父表(主表) 01 外键设置说明 设置添加外键 实现将一个表的字段与另外一张表的主键进行关联(实体与实体之间的联系),具体增加外键有两种形式: 方式一:在创建表的时候就增加外键: 在表字段之后使用foreign key

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 创建外键语法格式
foreign key(外键字段) references 主表(主键);
# 创建外键关联的父表
create table class(
id int primary key auto_increment,
name varchar(10) not null comment "班级名字,不能为空",
room varchar(10) comment '教室:允许为空'
) charset utf8;
# 创建子表使用外键
create table student(
id int primary key auto_increment,
number char(10) not null unique comment "学号:不能重复",
name varchar(10) not null comment "姓名",
c_id int,
foreign key(c_id) references class(id)
) charset utf8;
-- 增加外键:c_id是外键字段,class是引用表(父表),id是引用字段(主键)

查看外键信息是否配置成功:

图片

图片

图片

方式二:在创建表之后增加外键: 指定外键名字

1
2
3
4
5
6
7
# 创建外键语法格式
alter table 表名 add constraint 外键名 foreign key(外键字段) references 父表(主键字段)
# 创建没有外键信息的表
create table t_foreign(
id int primary key auto_increment,
c_id int
)charset utf8;

此时表中(t_foreign)没有创建外键:

1
2
# 在没有外键的表中添加外键
alter table t_foreign add constraint class_foreign foreign key(c_id) references class(id);

此时表中(t_foreign)显示了外键信息:

外键增加条件: 外键字段必须与引用表(父表主键)的数据类型严格保持一致 设置删除外键 外键不能被修改,只能先删除后再新增;

1
2
3
4
# 删除外键语法格式
alter table 表名 drop foreign key 外键名;
# 删除表(t_foreign)中外键信息
alter table t_foreign drop foreign key class_foreign;

删除外键后进行信息查看: 删除外键只能删除外键部分,不能删除外键创建的索引部分

图片

02 外键作用说明 外键也称之为外键约束,主要作用在于对数据进行约束: 约束01:外键对子表的数据写操作约束(增加和更新) 如果子表中插入的数据所对应的外键在父表不存在,创建不能成功.

1
2
3
4
5
6
7
mysql> select * from class;
Empty set (0.00 sec)
mysql> select * from student;
Empty set (0.00 sec)
mysql> insert into student values(null,'2023110001','xiaoQ',1);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`oldboy`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`c_id`)
REFERENCES `class` (`id`))

约束02:外键对父表也有数据约束 当父表操作一个记录,但是该记录被子表所引用的时候,那么父表的操作将会被限制(更新: 主键和删除)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mysql> insert into class values (1,'Linux80','001'),(2,'Linux81','002');
Quer y OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0
mysql> insert into student values(null,'2023110001','xiaoQ',1);
Quer y OK, 1 row affected (0.00 sec)
mysql> select * from student;
+----+------------+-------+------+
| id | number     | name  | c_id |
+----+------------+-------+------+
|  2 | 2023110001 | xiaoQ |    1 |
+----+------------+-------+------+
1 row in set (0.00 sec)
mysql> select * from class;
+----+---------+------+
| id | name    | room |
+----+---------+------+
|  1 | Linux80 | 001  |
|  2 | Linux81 | 002  |
+----+---------+------+
2 rows in set (0.00 sec)
mysql> delete from class where id=1;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`oldboy`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY
(`c_id`) REFERENCES `class` (`id`))
-- 删除父表数据,数据被字表所引用,所以不能更新或者删除父行记录

1.5.4 数据库数据模式概念

在数据库服务应用过程中存在SQL_mode概念(SQL模式),规范SQL执行行为和数据的准确性,能够符合数据录入常识和执行结果意义 例如:日期信息不能出现 0000-00-00 信息,月份只能是1-12,日期只能是1-31,一旦违反常识便会报错; 例如:在进行数据运算时,除法运算时,除数不能为0; 例如:当定义数据类型为char(10),不能超过字符长度,超过长度就报错; 例如:设置only_full_group_by(5.7以后的特性),禁止进行分组查询时,出现聚合信息1对多的显示输出; 获取SQLmode设置的默认信息:

1
2
3
4
5
6
7
mysql> select @@sql_mode;
+-----------------------------------------------------------------------------------------------------------------------+
| @@sql_mode                                                                                                            |
+-----------------------------------------------------------------------------------------------------------------------+
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+-----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

SQLmode配置参数信息解释说明:

模式参数配置解释说明
01ONLY_FULL_GROUP_BY对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中。
02STRICT_TRANS_TABLES在该模式下,如果一个值不能插入到一个事物表中,则中断当前的操作,对非事物表不做限制
03NO_ZERO_IN_DATE在严格模式下,不允许日期和月份为零
04NO_ZERO_DATE设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告
05ERROR_FOR_DIVISION_BY_ZERO在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如 果未给出该模式,那么数据被零除时MySQL返回NULL
06NO_ENGINE_SUBSTITUTION如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常
该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户希望插入的值为0,该列又是自增长的,那么这个选项就有
07NO_AUTO_VALUE_ON_ZERO
用了。
08NO_AUTO_CREATE_USER禁止GRANT创建密码为空的用户
09PIPES_AS_CONCAT将"
10ANSI_QUOTES启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符

当进行数据库服务版本升级时,可能之前版本数据信息不能满足新版本数据库服务的SQL_mode信息设定,需要暂时设置SQLmode为空

1
2
mysql> set global sql_mode='';
-- 配置完毕后,可以重新登录数据库服务进行检查确认

1.06 数据库服务语句应用(实践)

1.6.1 操作管理语言获取帮助

在数据库服务中,SQL语句涉及到的语句非常的多,在实际应用过程中也未必都能记住,因此就需要掌握获取帮助的方法;

1
2
3
4
5
6
7
8
# 获取帮助信息_基本帮助信息
mysql > \h
# 获取帮助信息_语句分类帮助
mysql > help contents
mysql > ? contents
# 获取帮助信息_具体语句帮助
mysql > ? create
mysql > ? create database

1.6.2 操作管理语句应用实践(DDL)

利用数据定于语言(DDL),负责管理数据库的基础数据(不会对表的内容修改),比如增删库、增删表、增删索引、增删用户等; 01 数据定义语言对数据库定义 数据库中的库是数据库服务结构中的重要组成部分,一个库就像是一个excel文档,库里含有表,一个表就是一个excel的sheet; 因此,对于数据库管理操作SQL语句命令,属于比较基础的数据库操作能力,需要重点关注; 创建数据库信息:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
mysql > create database oldboy;
mysql > create schema oldboy;
-- 创建新的数据库
mysql > create database oldboy character set utf8mb4;
mysql > create database oldboy charset utf8 collate utf8_general_mysql500_ci;
-- 创建新的数据库,并修改调整默认的字符编码
mysql > show databases;
-- 查看是否已经创建好
mysql > show create database oldboy;
-- 查看创建库的语句信息

查看数据库信息:

1
2
3
4
5
6
mysql > show databases;
-- 查看所有数据库信息
mysql > show databases like '%xiao%';
-- 检索查看指定的数据库信息
mysql > show create database oldboy;
-- 查看创建库的语句信息

数据库安装完毕后,默认的数据库说明:

序号数据库名称作用说明
01information_schema系统运行状态,性能等的库
02mysql授权权限、用户管理的库
03performance_schema系统运行状态,性能等的库

说明:以上三个是数据库系统中默认的数据库,可以用于管理应用。 修改数据库信息:

1
2
3
mysql > alter database test charset utf8mb4;
mysql > alter database test charset utf8 collate utf8_general_mysql500_ci;
-- 修改数据库服务字符集编码信息与字符编码排序规则信息

删除数据库信息:

1
2
3
mysql > drop database test;
mysql > drop schema test;
-- 删除数据库信息(在生产环境一定慎用)

切换数据库信息:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
mysql > use xiaoq
Database changed
-- 在已有数据库之间进行切换
mysql > select database();
+--------------+
| database() |
+--------------+
| xiaoq          |
+--------------+
1 row in set (0.00 sec)
-- 查看当前所在数据库信息

数据定义语句定义数据库规范说明: 创建数据库名称规范:要和业务有关,不要有大写字母(为了多平台兼容),不要数字开头,不要含有系统关键字信息; 创建数据库明确字符:创建数据库时明确(显示)的设置字符集信息,为了避免跨平台兼容性与不同版本兼容性问题; 删除数据库操作慎用:在对数据库进行删除操作时,一定要经过严格审计后再进行操作,并且数据库普通用户不能有drop权限; 02 数据定义语言对数据表定义 数据库中的表也是数据库服务结构中的重要组成部分; 创建数据表信息: 通过数据库服务管理工具,图形操作创建数据库表信息:

图片

图片

点击apply 后,会将图形操作的配置信息转换为相应的建表语句: 完整建表语句参考:

1
2
3
4
5
6
7
CREATE TABLE `student` (
`id` int NOT NULL COMMENT '学号信息',
`name` varchar(45) NOT NULL COMMENT '学生名',
`age` tinyint unsigned NOT NULL COMMENT '学生年龄',
`gender` enum('M','F','N') NOT NULL DEFAULT 'N' COMMENT '学生性别',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='学生表'

创建表的基本语法格式:

1
2
3
4
create table <表名> (
<字段名1> <类型1> ,

<字段名n> <类型n>);

以上是创建表的具体格式信息,其中create table是关键字,不能更改,但是大小写可以变化。 实战情况:需要创建一个学生信息表:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 切换数据库环境
mysql > use xiaoq;
mysql > select database();
-- 查看是否切换数据库成功
# 创建数据表信息
mysql > create table stu1(
id int(10) not null,
name varchar(20) not null,
age tinyint(2)  NOT NULL default '0',
dept varchar(16)  default NULL
);
# 查看数据表信息
mysql > show tables
mysql > desc stu1;
# 获取创建表语句
mysql > show create table stu1\G;
*************************** 1. row ***************************
Table: stu1
Create Table: CREATE TABLE `stu1` (
`id` int(10) NOT NULL,
`name` varchar(20) NOT NULL,
`age` tinyint(2) NOT NULL DEFAULT '0',
`dept` varchar(16) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)

查看数据表信息:

1
2
3
4
5
6
7
8
mysql >  use mysql;
-- 切换到指定数据库中
mysql >  show tables;
-- 查看数据库中所有表信息
mysql > desc stu1;
-- 查看数据库中指定表数据结构信息
mysql > show create table stu1;
-- 查看数据库中指定表创建语句信息

修改数据表信息: 修改数据表属性信息:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 修改数据表名称信息
mysql > rename table stu1 to stu2;
或者
mysql > alter table stu2 rename stu3;
-- 利用上面种方式均可修改表名称信息
mysql > show tables;
-- 查看表名称信息是否修改
# 修改数据表编码信息
mysql > alter table stu1 charset utf8mb4;
-- 修改表结构中字符集编码信息
mysql > show create table stu1;
-- 查看表字符编码信息情况

修改数据表结构信息:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 数据表结构调整命令语法
mysql > alter table <表名> add column <字段名称> <数据类型> <约束与属性> [comment '注释'] [选项参数];
-- 利用alter在数据表中添加新的表结构字段
mysql > alter table <表名> drop column <字段名称>;
-- 利用alter在数据表中删除已有表结构字段
mysql > alter table <表名> modify column <字段名称> <数据类型> <约束与属性> [comment '注释'] [选项参数];
-- 利用alter在数据表中修改已有表结构字段(数据类型 约束与属性)
mysql > alter table <表名> change column <旧字段名称> <新字段名称> <数据类型> <约束与属性> [comment '注释'] [选项参数];
-- 利用alter在数据表中修改已有表结构字段(字段名称 数据类型 约束与属性)
mysql > alter table <表名> drop index <字段名称> ;
-- 利用alter在数据表中删除已有表结构字段(约束与属性)
# 具体实际操作过程(添加新的表结构字段)
mysql > alter table stu add column telno char(11) not null unique key comment '手机号';
-- 在学生表中,添加新的表结构字段列(追加字段列-单列操作)
mysql > alter table stu add column wechat varchar(64) not null unique key comment '微信号' after age;
-- 在学生表中,添加新的表结构字段列(插入字段列-单列操作)
mysql > alter table stu add column sid int not null unique key comment '微信号' first;
-- 在学生表中,添加新的表结构字段列(插入首行列-单列操作)
mysql > desc stu
-- 查看表结构字段信息变化
# 具体实际操作过程(删除已有表结构字段)
mysql > alter table stu drop column sid;
-- 在学生表中,删除已有表结构字段列(删除指定字段列-单列操作)
# 具体实际操作过程(修改已有表结构字段)
mysql > alter table stu modify name varchar(64);
-- 在学生表中,修改已有表结构字段列(修改表结构数据类型)
mysql > alter table stu modify name varchar(64) not null comment '学生名';
-- 在学生表中,修改已有表结构字段列,最后带有保持原有配置的属性信息,否则其他属性信息会被还原为默认
mysql > alter table stu change name stuname varchar(64) not null comment '学生名';
或者
mysql > alter table stu change column name stuname varchar(64) not null comment '学生名';
-- 在学生表中,修改已有表结构字段列(修改表结构字段名称)
mysql > alter table stu modify name varchar(64) not null unique comment '学生名称';
-- 在学生表中,修改已有表结构字段列(修改表结构属性信息)了解即可
mysql > alter table stu drop index `name`;
-- 在学生表中,修改已有表结构字段列(删除表结构属性信息)了解即可
mysql > desc stu
-- 查看表结构字段信息变化

删除数据表信息:

1
2
3
4
5
6
7
# 数据表删除命令语法
mysql > drop table <表名>;
# 具体实际操作过程
mysql > drop table stu1;
-- 删除操作过程,会将定义的表结构和表中数据内容一并删除
mysql > truncate table stu1;
-- 删除操作过程,只是清空表中数据内容,但保留定义的表结构信息

数据定义语句定义数据表规范说明: 创建数据表名称规范:要和业务有关(含库前缀),不要有大写字母,不要数字开头,不要含有系统关键字信息,名称不要太长; 创建数据表属性规范:属性信息显示设置,引擎选择InnoDB,字符集选择utf8/utf8mb4,表信息添加注释; 创建数据列属性规范:名称要有意义,不要含有系统关键字信息,名称不要太长; 创建数据类型的规范:数据类型选择合适的、足够的、简短的; 创建数据约束的规范:每个表中必须都要有主键,最好是和业务无关列,实现自增功能,建议每个列都非空(避免索引失效)/加注释 删除数据表操作规范:对于普通用户不能具有删表操作,需要操作删表时需要严格审核 修改数据表结构规范:在数据库8.0之前,修改数据表结构需要在业务不繁忙时进行,否则会产生严重的锁 如果出现紧急修改表结构信息需求时,可以使用工具进行调整,比如使用:pt-osc、gh-ost,从而降低对业务影响 企业数据库面试题目分析练习: 01 请查看以下建表语句给出规范和优化建议:(物流公司日常工作表信息)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
create table 't_area_distribution_cost' (
'id' bigint(20) not null auto_increment comment '主键',
'city_id' varchar(200),
'city_name' varchar(200),
'warehouse_id' varchar(200),
'warehouse_name' varchar(200)  ,
'station_region_id' varchar(200),
'station_region_name' varchar(200),
'replenish_type' varchar(200),
'distribution_cost' varchar(200),
'c_t' varchar(200) default '0' comment '创建时间',
'create_user' varchar(200) default '0' comment '创建人ID',
'creater' varchar(200) comment '创建人',
'u_t' varchar(200) default '0' comment '修改时间',
'update_user' varchar(200) default '0' comment '修改人ID',
'updater' varchar(200),
'is_deleted' varchar(200) comment '删除标记(1 ,删除;0,不删除,有效)',
primary key ('id'),
key 'i_abc_city_id' ('city_id') comment '城市ID索引',
key 'i_abc_warehouse_id' ('warehouse_id'),
key 'i_abc_station_region_id' ('station_region_id')
) ENGINE=innodb default charset=utf8 comment='区域配送运费设置';

问题解答分析:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 修改建议01:表明信息略长可以进行调整
create table 't_area_distribution_cost'
# 修改建议02:数据类型信息设定尽量合适
'city_id' varchar(200),
'city_name' varchar(200),
# 修改建议03:定义索引信息没有设置非空
'city_id' varchar(200),
'warehouse_id' varchar(200),
'station_region_id' varchar(200),
# 修改建议04:表中字段列信息可以加注释
'city_id' varchar(200),
'city_name' varchar(200),
'warehouse_id' varchar(200),
'warehouse_name' varchar(200)  ,
'station_region_id' varchar(200),

02 研发同学需要紧急上线,需要DBA审核SQL,请问以下语句需要如何评估后上线执行,请写审核SQL要点

1
2
3
4
alter table t_enter_cooperate_info add account_day  INT not null default 0 comment '账期天数',
alter table t_enter_cooperate_info add account_detay_day INT not null default 0 comment '账期付款天数',
alter table t_pop_basic add account_day INT not null default 0 comment '账期天数',
alter table t_pop_basic add account_detay_day INT not null default 0 comment '账期付款天数'

问题解答分析: 本身语句是没有任何问题的,但需要说明,尽量业务繁忙时不要进行发布,选择夜里业务不繁忙时进行发布; 在进行SQL语句信息审核时,需要了解SQL语句的含义和作用:

1
2
3
4
5
6
alter table t_enter_cooperate_info add account_day  INT not null default 0 comment '账期天数',
alter table t_enter_cooperate_info add account_detay_day INT not null default 0 comment '账期付款天数',
-- 表示在t_enter_cooperate_info表中 添加两列信息 并设置相应属性和注释信息
alter table t_pop_basic add account_day INT not null default 0 comment '账期天数',
alter table t_pop_basic add account_detay_day INT not null default 0 comment '账期付款天数'
-- 表示在t_pop_basic add表中 添加两列信息 并设置相应属性和注释信息

通过对以上SQL语句信息解读,可以看出语句操作属于DDL操作,线上操作DDL语句可能会产生比较严重的锁进制等待(死锁问题); 可以结合企业的数据业务存储的负载压力(TPS),可能当前时间段的TPS数值较高,原则上不建议进行线上操作; 但是考虑到业务需求的紧急情况,建议使用PT-osc工具进行数据库线上操作,减少对线上业务的影响,但不能提高操作效率;

1.6.3 操作管理语句应用实践(DML)

数据操作语言(DML),主要针对数据库里的表里的数据进行操作,用来定义数据内容信息(数据); 01 数据操作语言对数据信息调整 增加数据内容信息(insert) 添加命令语法格式:

1
2
3
# 数据表数据插入命令语法
mysql> insert into <表名> [( <字段名1>[,..<字段名n > ])] values ( 1 )[, ( n )]
-- 属于表内容信息变更操作,需要按照表结构预先定义好的字段信息插入

实际操作命令演示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 具体实际操作过程
mysql> desc stu1;
mysql> insert into stu1(id,name,age,dept) values(1,'oldboy',35,'net sec');
-- 插入单行信息标准方法(信息输入不要重复,且特定信息不要为空)
mysql> insert into stu1(id,name,age,dept) values(0,'oldboy',35,'net sec');
mysql> insert into stu1(id,name,age,dept) values(null,'oldboy',35,'net sec');
-- 插入单行信息标准方法(自增列信息可以填入0或null,表示默认实现自增效果)
mysql> insert into stu1 values(2,'oldgirl',25,'linux');
-- 插入单行信息可以不含有表字段信息
mysql> insert into stu1 values(03,'littlegirl',2,'net sec'),(04,'littleboy',1,'Linux');
-- 插入多行信息可以不含有表字段信息
mysql> insert into stu1(name,age) values('oldboy',35);
-- 插入当行信息可以只含部分字段信息,但是省略字段信息必须具有自增特性 或 可以为空 或有默认值输入
mysql> insert into stu1 values(6,'老男孩',32,'python,linux,net sec');
-- 插入中文信息
# 检查信息是否插入成功
mysql> select * from stu1;

修改数据内容信息(update) 修改命令语法格式:

1
2
3
# 数据表数据修改命令语法
mysql> update 表名 set 字段=新值, where 条件;
-- 属于表内容信息变更操作,需要按照表结构预先定义好的字段信息修改,并且按照条件修改,默认全表修改

实际操作命令演示:

1
2
3
4
5
# 具体实际操作过程
mysql> update stu1 set name="zhangsan" where id=6;
-- 修改表数据内容标准方式,修改时一定要加条件信息(条件信息建议为主键或具有唯一性信息)
# 检查信息是否修改成功
mysql> select * from stu1;

知识扩展:禁止修改命令不加条件信息执行命令: 服务端禁止不带where条件操作数据库表有两种方法: 利用sql_safe_updates配置参数,表示在delete,update操作中: 没有where条件,当where条件中列没有索引可用,且无limit限制时会拒绝更新。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 方法1:临时执行
mysql> set global sql_safe_updates=1;
-- 退出重新登陆生效
mysql> update stu set sname='oldboy';
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column.
-- 配置效果展示
# 方法2:永久生效
[root@db01 ~]# vi /etc/my.cnf
[mysqld]
init-file=/opt/ init.sql
-- 新建脚本
echo 'set global sql_safe_updates=1;' >/opt/ init.sql
chmod +x /opt/ init.sql
/etc/init.d/mysqld restart
[root@db01 ~]# mysql -uroot -poldboy123 -e "select @@global.sql_safe_updates"
+-------------------------------------+
| @@global.sql_safe_updates |
+-------------------------------------+
| 1                                                |
+-------------------------------------+

客户端禁止不带where条件操作数据库表有两种方法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 方法一:把safe_updates=1加入到my.cnf的client标签下
[root@db01 ~]# vim /etc/my.cnf
[mysql]
socket=/tmp/mysql.sock
safe_updates=1
-- 客户端配置信息
mysql> update stu set sname='oldboy01';
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column.
-- 配置效果展示
# 方法2:设置数据库别名操作方式
alias mysql='mysql -U'
-U, --safe-updates  Only allow UPDATE and DELETE that uses keys
-- 表示以安全更新模式登录数据库,并放入/etc/profile永久生效。
mysql> update stu set sname='oldboy03';
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column.
-- 配置效果展示

删除数据库中数据信息: 删除命令语法格式:

1
2
3
# 数据表数据删除命令语法
mysql> delete from 表名 where 表达式;
-- 属于表内容信息变更操作,需要按照表结构预先定义好的字段信息删除,并且按照条件删除,默认全表删除

实际操作命令演示:

1
2
3
4
5
6
7
8
# 具体实际操作过程
mysql> delete from stu1 where id=6;
mysql> delete from stu1 where id<3;
mysql> delete from stu1 where age=2 or age=1;
mysql> delete from stu1;
-- 删除表信息时,如果不加条件会进行逐行删除全表信息(效率比较慢)
# 检查信息是否删除成功
mysql> select * from stu1;

删除数据库信息扩展:伪删除操作 由于执行删除语句信息时,有可能会对一些业务数据造成影响,甚至可能会将表中所有数据清空,虽然可以通过日志信息恢复(闪回) 但是整体操作过程还是比较危险的,因此在进行数据信息删除操作时,可以利用伪删除操作代替真实删除操作; 一般在数据库中删除数据信息,是因为从业务层面有些数据不想被查询获取到,伪删除就是不让查询时可以获取想要删除的数据; 伪删除的本质:利用update替代delete 可以在相应表中添加状态列信息,可以将状态列设置为:1表示存在 0表示不存在 在进行伪删除操作时,只是将状态列信息改为0,但是并没有把相应行的数据信息删除,但是在查询时可以忽略状态列为0的信息; 这样可以有效规避误删除操作对业务数据的影响,万一伪删除操作有问题,可以再将状态列信息0改为1即可

1
2
3
4
5
6
7
8
9
# 真实删除数据信息操作举例
mysql> delete from stu1 where id=6;
# 伪删除数据信息操作举例
mysql> alter table stu1 add state tinyint not null default 1;
-- 在原有表中添加新的状态列
mysql> update stu1 set state=0 where id=6;
-- 将原本删除列信息的状态改为0,实现伪删除效果
mysql> select * from stu1 where state=1;
-- 实现查询时不要获取状态为0的信息,即不查看获取伪删除数据信息