ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

MySQL的操作

MySQL的操作

上一个博客我们认识了数据库,了解了数据库的基础,下面我们来了解在MySQL中库是怎么操作的。

一、对库的操作

1.1 创建数据库

创建数据库的语法如下:

CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name

语法解释:

1.大写的表示关键字

2.[] 代表可选项,写或者不写都行

3.IF NOT EXISTS:如果数据库不存在才创建,防止重复创建报错

4.create_specification表示数据库的配置项,有两个可选:

CHARACTER SET表示的是指定数据库字符集,比如utf8mb4

COLLATE表示的是指定数据库字符集的校验规则

create database d4 charset=utf8 collate=utf8_general_ci;

带上字符集和校验规则选项执行建库语句后,当前新建的数据库后续所有操作都会按照我们预先设置的字符集与校验规则执行运行。

字符集是存在优先级规则的。优先级顺序为:字段字符集 > 表字符集 > 数据库字符集

如果字段单独指定了字符集,会优先使用字段自身配置的字符集,直接忽略当前表、数据库设置的字符集; 倘若字段没有单独指定字符集,就会继承这张表定义的字符集配置; 如果数据表同样未手动指定字符集,最终会继承该表所属数据库的默认字符集。

1.2 查询数据库

SHOW DATABASES;

用于查看当前 MySQL 服务器中所有数据库。

DESC db_name;

用于查看数据库信息。

1.3 显示创建语句

SHOW CREATE DATABASE db_name;

用于查看创建该数据库时的完整语句,包含字符集、校验规则。

1.4 修改数据库

ALTER DATABASE db_name [alter_spacification [,alter_spacification]...] alter_spacification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name

对数据库的修改主要指的是修改数据库的字符集、校验规则。

1.5 删除数据库

DROP DATABASE [IF EXISTS] db_name;

执行删除之后的结果:

数据库内部看不到对应的数据库,且对应的数据库文件夹被删除,级联删除,里面的数据表全部被删除。需要注意的是,一般不要随意地删除数据库!

1.6 库的备份与恢复

库的备份

在命令行中输入下面的指令可以对数据库进行备份:

mysqldump -P端口 -u用户名 -p密码 -B 数据库名 > 备份文件路径.sql

使用示例:

将d1库备份到文件

mysqldump -P3306 -u root -p123456 -B d1 > /home/zrh/mysql/d1.sql

备份成功后指定的路径下就会出现对应的备份文件:

如果备份的不是整个数据库,而是其中的一张表,可以使用下面的命令:

mysqldump -u root -p 数据库名 表名1 表名2 > D:/mytest.sql

同时备份多个数据库可以这样做:

mysqldump -u root -p -B 数据库名1 数据库名2 ... > 数据库存放路径

库的还原

SOURCE file_path;

使用示例:

如果备份一个数据库时,没有带上 - B 参数,在恢复数据库时,需要先创建空数据库,然后使用数据库,再使用 source 来还原:

先登录 mysql,手动创建数据库(库名要和原来一致)

CREATE DATABASE d1;

然后在终端执行还原,指定数据库:

mysql -P3306 -uroot -p d1 < /home/zrh/mysql/d1.sql

1.7 查看连接情况

show processlist;

使用示例:

二、对表的操作

2.1 创建表

CREATE TABLE table_name ( field1 datatype COMMENT '字段1注释', field2 datatype COMMENT '字段2注释', field3 datatype COMMENT '字段3注释' ) CHARACTER SET 字符集 COLLATE 校验规则 ENGINE 存储引擎 COMMENT='表注释';

语句解释:

1.field 表示列名

2.datatype 表示列的类型

3.character set 字符集,如果没有指定字符集,则以所在数据库的字符集为准

4.collate 校验规则,如果没有指定校验规则,则以所在数据库的校验规则为准

使用示例:

不同的存储引擎,创建表的文件不一样。student表存储引擎是 MyISAM,在数据目录中有三个不同的文件,分别是:

1.student.frm:表结构定义文件

2.student.ibd:数据 + 索引放在同一个文件里(独立表空间模式,默认)

如果使用的是MyISAM引擎,则会有三个不同的文件,分别是:

1.student.frm:表结构

2.student.MYD:表数据

3.student.MYI:表索引

2.2 查看表结构

查看表结构一般会用到下面两条语句:

SHOW CREATE TABLE table_name;

用于获取建表原语句,信息最全。

直接使用该语句得到的输出如下图所示:

直接使用SHOW CREATE TABLE table_name;语句默认是横向排版,当建表语句太长时,会折行看着很乱。所以一般会在后面带上\G,变为纵向排版:

DESC table_name;

用于快速看字段属性,但看不到存储引擎、字符集、表注释。

输出:字段清单表格

Field:列名

Type:字段类型

Null:是否允许为空

Key:是否主键 / 索引

Default:默认值

Extra:额外信息(自增等)

2.3 修改表

在项目实际开发中,经常修改某个表的结构,比如字段名字,字段大小,字段类型,表的字符集类型,表的存储引擎等等。我们还有需求,添加字段,删除字段等等。这时我们就需要修改表。

核心命令:

ALTER TABLE 表名;

1.添加字段 ADD

ALTER TABLE table_name ADD field datatype [COMMENT '注释'];

示例:给 student 新增 age 字段

ALTER TABLE student ADD age INT COMMENT '年龄';

加在指定字段后面(AFTER)

ALTER TABLE users ADD gender CHAR(1) COMMENT '性别' AFTER name;

加到第一个位置:FIRST

ALTER TABLE student ADD id INT FIRST;

2. 修改字段类型 / 注释 MODIFY(不改字段名)

ALTER TABLE table_name MODIFY field datatype [COMMENT '注释'];

示例:修改 name 长度

ALTER TABLE student MODIFY name VARCHAR(30) COMMENT '姓名';

需要注意的是,在使用MODIFY修改字段时,如果不写COMMENT,原有字段注释会丢失! 因为MODIFY是覆盖式重定义整个字段,不是只修改你写的那一项属性。如下图所示:

3. 修改字段名 CHANGE(可以同时改名 + 改类型)

ALTER TABLE table_name CHANGE old_field new_field datatype [COMMENT '注释'];

示例:把 name 改成 username

ALTER TABLE student CHANGE name username VARCHAR(20) COMMENT '用户姓名';

CHANGE 同样是覆盖式定义字段,不写 COMMENT,注释也会丢失。

MODIFY:只改类型、长度、注释,不能改列名;而CHANGE可以将旧名改为新名,也可以顺带改类型。

4. 删除字段 DROP

ALTER TABLE table_name DROP field;

示例:删除 age 字段

ALTER TABLE student DROP age;

5. 修改表名 RENAME

ALTER TABLE old_table RENAME TO new_table;

示例:将表名student改为students

ALTER TABLE student RENAME TO students

6. 修改表字符集 / 存储引擎

ALTER TABLE table_name CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; ALTER TABLE table_name ENGINE=InnoDB;

2.4 删除表

DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ...

[TEMPORARY]:只删除临时表,普通表不受影响。

表的删除支持一次性删除多张表,逗号分隔:

DROP TABLE IF EXISTS t1, t2, t3;

使用DROP TABLE语句会直接删除整张表,表结构 + 表里所有数据全部删除,不可恢复!所以在工程实践中我们应该尽可能避免删除操作。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进