文章目录
- MYSQL:表的操作
-
- [1. 本文简述](#1. 本文简述)
- [2. 查看所有表](#2. 查看所有表)
-
- [2.1 语法](#2.1 语法)
- [3. 创建表](#3. 创建表)
-
- [3.1 语法](#3.1 语法)
- [3.2 示例](#3.2 示例)
- [3.3 表在磁盘上对应的文件](#3.3 表在磁盘上对应的文件)
- [3.4 创建表时使用 `IF NOT EXISTS`](#3.4 创建表时使用
IF NOT EXISTS
)
- [4. 查看表结构](#4. 查看表结构)
-
- [4.1 语法](#4.1 语法)
- [4.2 示例](#4.2 示例)
- [5. 修改表](#5. 修改表)
-
- [5.1 语法](#5.1 语法)
- [5.2 示例](#5.2 示例)
-
- [5.2.1 向表中添加一列](#5.2.1 向表中添加一列)
- [5.2.2 修改列的定义](#5.2.2 修改列的定义)
- [5.2.3 重命名列](#5.2.3 重命名列)
- [5.2.4 删除某个字段](#5.2.4 删除某个字段)
- [5.2.5 修改表名](#5.2.5 修改表名)
- [6. 删除表](#6. 删除表)
-
- [6.1 语法](#6.1 语法)
- [6.2 示例](#6.2 示例)
- [6.3 注意事项](#6.3 注意事项)
MYSQL:表的操作
1. 本文简述
在之前的文章中,我们学会了如何操作数据库本身。今天,我们把目光聚焦到数据库内部的核心------数据表。希望本文能够让你掌握数据表的"增删改查"四大基本功,也就是如何创建、查看、修改和删除一张表。
2. 查看所有表
当我们进入一个数据库后,第一步往往是想看看里面到底有哪些表。这时候,一个非常直观的命令就派上用场了。
2.1 语法
sql
-- 这个命令会列出当前所在数据库中的所有表
show tables;
3. 创建表
表是数据库中存放数据的基本单位,也是我们打交道最多的对象。可以把它理解为一个结构化的数据容器,就像一张规定好了列(字段)的表格,我们之后的数据都会一行一行地存放在里面。
3.1 语法
创建表的通用语法如下:
sql
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name (
field_name datatype [CONSTRAINTS] [COMMENT '注解内容'],
field_name datatype [CONSTRAINTS] [COMMENT '注解内容'],
...
) [ENGINE=存储引擎] [CHARACTER SET=字符集] [COLLATE=排序规则];
这个语法看起来选项很多,我们来逐一拆解一下其中的关键部分:
TEMPORARY
: 加上它,创建的就是一个临时表。这种表只在当前的数据库会话中有效,一旦会话结束,它就会被自动删除,非常适合用在一些临时的计算场景。IF NOT EXISTS
: 这是一个非常有用的防御性编程技巧。它告诉 MySQL:"只有在不存在同名表的情况下才创建"。这样可以有效避免因表已存在而导致的执行错误。field_name
: 定义列的名称,也就是我们常说的"字段名"。datatype
: 指定这一列用来存储什么类型的数据,例如整数INT
、字符串VARCHAR(50)
等。CONSTRAINTS
: 为列添加约束,比如NOT NULL
(代表该列必须有值)、PRIMARY KEY
(主键)等。关于约束的详细内容,我们会在后续的章节深入探讨。COMMENT
: 为列添加注释。这是一个非常好的习惯,清晰的注释能让其他开发者(以及未来的自己)快速理解每个字段的用途。ENGINE
: 指定表的存储引擎,比如我们常用的InnoDB
或MyISAM
。如果不指定,MySQL 会使用默认的存储引擎(在现代版本中通常是InnoDB
)。CHARACTER SET
: 指定表数据的默认字符集,例如utf8mb4
,它能很好地支持包括 Emoji 在内的各种字符。COLLATE
: 指定字符集的排序和比较规则,例如utf8mb4_0900_ai_ci
。
如果想了解所有细节,随时可以查阅官方文档:
https://dev.mysql.com/doc/refman/8.0/en/create-table.html
3.2 示例
理论说完了,我们来动手实践一下。
-
创建一个基础的用户表
我们来创建一个名为
users
的表,包含用户ID、用户名、密码和生日,并为其指定推荐的utf8mb4
字符集。sql-- 创建一个名为 users 的表,并为每个字段添加注释 CREATE TABLE users ( id BIGINT COMMENT '用户唯一ID', name VARCHAR(20) COMMENT '用户名', password CHAR(32) COMMENT '密码,通常存储32位的MD5摘要', birthday DATE COMMENT '生日' ) CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci;
-
创建一个指定存储引擎的表
如果我们有特殊需求,比如需要使用
MyISAM
存储引擎,可以在创建时显式指定。sql-- 创建一个使用 MyISAM 存储引擎的表 CREATE TABLE t_myisam ( id BIGINT, name VARCHAR(20) COMMENT '用户名' ) ENGINE = MyISAM;
3.3 表在磁盘上对应的文件
我们用 SQL 创建了一张表,那么它在我们的电脑硬盘上究竟是以什么形式存在的呢?这和表的存储引擎密切相关。
- InnoDB 存储引擎 : 作为 MySQL 的默认存储引擎,
InnoDB
的管理方式比较简洁。通常,它会为每张表在数据库对应的文件夹下创建一个名为表名.ibd
的文件。这个.ibd
文件就像一个打包好的盒子,里面既包含了表的结构定义,也包含了表里的所有行数据。
在我的电脑里 MySQL 的数据目录 (datadir)
sql#使用SQL命令查看目录,并找到数据库名称命名的子文件夹 SHOW VARIABLES LIKE 'datadir';
-
MyISAM 存储引擎 : 相比之下,
MyISAM
引擎会将一张表的信息拆分成三个文件存放:表名.MYD
(MYData): 这个文件专门用来存放表的所有数据行。表名.MYI
(MYIndex): 这个文件则负责存储表的索引信息,用于加速查询。表名.sdi
(Serialized Dictionary Information): 在 MySQL 8.0 及更新的版本中,这是一个包含表元数据(比如表结构定义)的 JSON 格式文件。而在较早的版本中,这些元数据信息是存放在一个叫表名.frm
的文件里的。
这是上文创建的
MyISAM
存储引擎的t_myisam表对应的文件
3.4 创建表时使用 IF NOT EXISTS
如果在写脚本或程序时,重复执行创建表的语句,会发生什么呢?
sql
-- 尝试创建一个已经存在的 'users' 表
create table users (
id int,
name varchar(20)
);
-- MySQL会直接报错,提示表已存在
ERROR 1050 (42S01): Table 'users' already exists

为了避免这种情况中断我们的程序,IF NOT EXISTS
就派上用场了。它就像一个安全阀,正如我们之前在操作数据库时学到的那样。
sql
-- 使用 IF NOT EXISTS 可以避免因表已存在而报错
create table if not exists users (
id int,
name varchar(20)
);
-- 这次,MySQL 不会报错,而是返回一个警告
Query OK, 0 rows affected, 1 warning (0.01 sec)
-- 我们可以通过 show warnings; 查看警告的具体内容
show warnings;

这种方式让我们的 SQL 脚本健壮性更强,尤其在需要重复执行的自动化任务中非常实用。
4. 查看表结构
表创建好了,有时候我们想确认一下它的结构是否正确,或者忘记了某个字段的具体定义,就需要查看表结构。
4.1 语法
sql
-- DESC 是 DESCRIBE 的缩写,两者功能完全一样
DESC table_name;
4.2 示例
sql
desc users;

我们来看看这个结果中每一列的含义:
Field
: 列名。Type
: 该列的数据类型。Null
: 表示该列是否允许存储NULL
值。YES
代表允许,NO
则代表不允许。Key
: 该列的索引类型。例如,PRI
表示它是主键 (Primary Key)。Default
: 如果插入新数据时没有为该列指定值,它会使用的默认值。Extra
: 一些额外的信息,比如auto_increment
表示该列是自增的。
5. 修改表
在软件开发中,需求变更是家常便饭。因此,对已经创建好的表结构进行调整也是一项必备技能。我们可能需要增加一个新字段,修改现有字段的类型,或者删除一个不再需要的字段。ALTER TABLE
命令就是我们完成这些任务的利器。
5.1 语法
ALTER TABLE
的基本语法结构如下:
sql
ALTER TABLE tbl_name [alter_option [, alter_option] ...];
这里的 alter_option
就是我们具体要做的修改操作,常见的有:
sql
-- 添加新的一列
ADD [COLUMN] col_name column_definition [FIRST | AFTER other_col_name]
-- 修改现有列的定义(比如数据类型、约束等)
MODIFY [COLUMN] col_name new_column_definition [FIRST | AFTER other_col_name]
-- 删除一列
DROP [COLUMN] col_name
-- 重命名一列
RENAME COLUMN old_col_name TO new_col_name
-- 重命名整张表
RENAME [TO | AS] new_tbl_name
想了解更全面的修改选项,可以查阅官方文档:
https://dev.mysql.com/doc/refman/8.0/en/alter-table.html
5.2 示例
下面我们通过一些操作,来熟悉 ALTER TABLE
的用法。
5.2.1 向表中添加一列
假设业务升级,需要为用户增加一个存储头像地址的功能。我们可以在 birthday
字段后面添加一个 avatar
字段。
sql
-- 使用 ADD ... AFTER ... 来指定新列的位置
alter table users ADD avatar varchar(255) comment '头像地址' after birthday;
-- 查看修改后的表结构
desc users;

5.2.2 修改列的定义
随着用户量的增长,我们发现 name
字段的 varchar(20)
长度可能不够用,需要将其扩展到 50
。
sql
-- 使用 MODIFY 来修改现有列的定义
alter table users MODIFY name varchar(50);
-- 查看结果,可以看到 name 字段的类型已经改变
desc users;

5.2.3 重命名列
出于规范考虑,我们想把 birthday
列统一命名为 birth_date
。
sql
-- 使用 RENAME COLUMN ... TO ... 来重命名
alter table users RENAME COLUMN birthday TO birth_date;
-- 查看结果
desc users;

5.2.4 删除某个字段
后来发现 avatar
这个功能暂时不上了,我们可以将这个字段从表中移除。
sql
-- 使用 DROP 来删除列
alter table users DROP avatar;
-- 再次查看表结构,avatar 列已经消失了
desc users;

5.2.5 修改表名
如果 users
这个表名不够贴切,比如它实际上存的是员工信息,我们可以把它重命名为 employees
。
sql
-- 使用 RENAME TO 来修改表名
alter table users RENAME TO employees;
-- 查看当前数据库的所有表,确认 users 已经变成了 employees
show tables;

小提示: 还有另一种重命名表的语法
RENAME TABLE old_table_name TO new_table_name;
。这种方式功能更强大,甚至可以一次性为多张表重命名。
6. 删除表
删除表是一个高危操作。一旦执行,不仅是表结构,里面存储的所有数据都会被永久性地、不可恢复地删除。
6.1 语法
sql
DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ...
IF EXISTS
: 同样是我们的安全网,可以避免因尝试删除一个不存在的表而导致脚本报错。- 这个命令支持一次性删除多张表,只需将表名用逗号隔开即可。
6.2 示例
sql
-- 使用 IF EXISTS 安全地删除 employees 表
drop table if exists employees;
-- 也可以同时删除多张表
drop table if exists t_myisam;
-- 查看所有表,确认它们都已被删除
show tables;

6.3 注意事项
- 删除表是不可逆的,请务必谨慎操作! 在生产环境中,执行此操作前一定要再三确认,并确保有数据备份。
- 删除表成功后,其在磁盘上对应的物理文件(如
.ibd
文件)也会被一并删除。