MySQL 表操作知识文档
一、学习目标
掌握 MySQL 中表的完整生命周期操作:
- 查看数据库中的表
- 创建普通表和临时表
- 查看表结构
- 添加、修改、重命名和删除字段
- 重命名表
- 删除一个或多个表
- 理解 InnoDB 与 MyISAM 表在磁盘上的文件形式
二、核心命令速查
| 操作 | SQL |
|---|---|
| 查看当前数据库中的所有表 | SHOW TABLES; |
| 创建表 | CREATE TABLE 表名 (...); |
| 表不存在时才创建 | CREATE TABLE IF NOT EXISTS 表名 (...); |
| 创建临时表 | CREATE TEMPORARY TABLE 表名 (...); |
| 查看表结构 | DESC 表名; |
| 添加字段 | ALTER TABLE 表名 ADD 字段定义; |
| 修改字段定义 | ALTER TABLE 表名 MODIFY 字段定义; |
| 重命名字段 | ALTER TABLE 表名 RENAME COLUMN 旧字段 TO 新字段; |
| 删除字段 | ALTER TABLE 表名 DROP COLUMN 字段名; |
| 重命名表 | ALTER TABLE 旧表名 RENAME TO 新表名; |
| 删除表 | DROP TABLE 表名; |
| 表存在时才删除 | DROP TABLE IF EXISTS 表名; |
三、查看所有表
sql
SHOW TABLES;
该命令只显示当前已选数据库中的表。若尚未选择数据库,应先执行:
sql
USE 数据库名;
四、创建表
4.1 基本语法
sql
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] 表名 (
字段名 数据类型 [约束] [COMMENT '字段说明'],
字段名 数据类型 [约束] [COMMENT '字段说明']
)
[ENGINE = 存储引擎]
[DEFAULT CHARACTER SET = 字符集]
[COLLATE = 排序规则];
4.2 关键选项
| 选项 | 作用 |
|---|---|
TEMPORARY |
创建临时表,通常仅在当前会话中有效 |
IF NOT EXISTS |
表已存在时不报错,通常会产生警告 |
COMMENT |
为字段添加说明 |
ENGINE |
指定存储引擎 |
CHARACTER SET |
指定字符集 |
COLLATE |
指定排序规则 |
4.3 创建用户表
sql
CREATE TABLE users (
id BIGINT,
name VARCHAR(20) COMMENT '用户名',
password CHAR(32) COMMENT '32位MD5密码值',
birthday DATE COMMENT '生日'
)
CHARACTER SET = utf8mb4
COLLATE = utf8mb4_0900_ai_ci;
字段设计说明:
BIGINT:适合保存范围较大的整数编号。VARCHAR(20):保存长度可变的用户名。CHAR(32):适合保存固定长度为 32 的字符串。DATE:只保存年月日,不保存具体时间。
4.4 指定 MyISAM 存储引擎
sql
CREATE TABLE t_myisam (
id BIGINT,
name VARCHAR(20) COMMENT '用户名'
)
ENGINE = MyISAM;
4.5 防止重复创建
sql
CREATE TABLE IF NOT EXISTS users (
id INT,
name VARCHAR(20)
);
查看产生的警告:
sql
SHOW WARNINGS;
五、存储引擎与磁盘文件
5.1 InnoDB
创建 InnoDB 表后,通常会生成:
text
表名.ibd
.ibd 文件用于保存该表的数据和索引信息。
5.2 MyISAM
MyISAM 表通常对应多个文件:
| 文件 | 作用 |
|---|---|
表名.MYD |
数据文件 |
表名.MYI |
索引文件 |
表名.sdi |
表结构描述文件,通常为 JSON 格式 |
MySQL 8.0 以前,表结构信息常保存在 .frm 文件中。
六、查看表结构
sql
DESC users;
DESC 输出字段说明:
| 列 | 含义 |
|---|---|
Field |
字段名 |
Type |
字段的数据类型和长度 |
Null |
是否允许保存 NULL |
Key |
索引类型 |
Default |
默认值 |
Extra |
自动增长等扩展信息 |
也可以写成:
sql
DESCRIBE users;
七、修改表结构
7.1 基本语法
sql
ALTER TABLE 表名 修改选项;
常用修改选项:
sql
ADD [COLUMN] 字段名 字段定义 [FIRST | AFTER 已有字段名]
MODIFY [COLUMN] 字段名 新字段定义 [FIRST | AFTER 已有字段名]
DROP [COLUMN] 字段名
RENAME COLUMN 旧字段名 TO 新字段名
RENAME TO 新表名
7.2 添加字段
在 birthday 字段后添加头像地址:
sql
ALTER TABLE users
ADD COLUMN assets VARCHAR(100) COMMENT '头像地址'
AFTER birthday;
字段位置控制:
sql
-- 添加到第一列
ALTER TABLE users
ADD COLUMN code VARCHAR(20) FIRST;
-- 添加到指定字段之后
ALTER TABLE users
ADD COLUMN assets VARCHAR(100) AFTER birthday;
不写 FIRST 或 AFTER 时,新字段默认添加到表的末尾。
7.3 修改字段类型或长度
将 assets 的最大长度由 100 改为 255:
sql
ALTER TABLE users
MODIFY COLUMN assets VARCHAR(255);
使用 MODIFY 时应完整写出新的字段定义。原有的注释、默认值或约束不会自动补充,遗漏后可能发生改变。
例如保留字段注释:
sql
ALTER TABLE users
MODIFY COLUMN assets VARCHAR(255) COMMENT '头像地址';
7.4 重命名字段
sql
ALTER TABLE users
RENAME COLUMN assets TO avatar;
此操作只修改字段名,不主动修改其数据类型和已有数据。
7.5 删除字段
sql
ALTER TABLE users
DROP COLUMN avatar;
也可以省略 COLUMN:
sql
ALTER TABLE users
DROP avatar;
删除字段会同时删除该字段中的全部数据,执行前应确认数据是否仍有保留价值。
7.6 重命名表
方式一:
sql
ALTER TABLE users
RENAME TO employee;
方式二:
sql
RENAME TABLE users TO employee;
重命名后,表结构和表中数据仍然保留,但原表名不再可用。
八、删除表
8.1 基本语法
sql
DROP [TEMPORARY] TABLE [IF EXISTS]
表名 [, 表名 ...];
8.2 删除单个表
sql
DROP TABLE employee;
8.3 删除多个表
sql
DROP TABLE employee, t_myisam;
8.4 安全删除
sql
DROP TABLE IF EXISTS employee;
IF EXISTS 可以避免目标表不存在时直接报错。
8.5 注意事项
- 删除表会删除表结构和表中的全部数据。
- 表对应的磁盘数据文件也会被删除。
DROP TABLE属于高风险操作,执行前应核对数据库名和表名。- 重要数据应先备份。
- 不要把"删除字段"和"删除表"混淆:
ALTER TABLE ... DROP COLUMN ...删除字段。DROP TABLE ...删除整张表。
九、常见易错点
9.1 忘记选择数据库
sql
USE 数据库名;
否则可能在错误的数据库中创建或删除表。
9.2 字符串长度设计不合理
sql
name VARCHAR(20)
括号中的数字表示最大字符长度。长度过小会造成数据无法完整保存,长度过大则可能增加设计和索引成本。
9.3 CHAR 与 VARCHAR 使用混淆
CHAR(n):固定长度,适合长度稳定的数据。VARCHAR(n):可变长度,适合长度不固定的数据。
例如:
sql
password CHAR(32);
name VARCHAR(20);
9.4 修改字段时遗漏原属性
下面的语句可能使原有注释、默认值或约束发生变化:
sql
ALTER TABLE users
MODIFY assets VARCHAR(255);
更稳妥的方式是写出完整字段定义:
sql
ALTER TABLE users
MODIFY assets VARCHAR(255)
COMMENT '头像地址';
9.5 误用删除命令
sql
ALTER TABLE users DROP COLUMN avatar; -- 删除一个字段
DROP TABLE users; -- 删除整张表
执行删除类语句前,应先运行:
sql
SHOW TABLES;
DESC 表名;
确认目标对象。
十、练习:商店数据库
10.1 创建并选择数据库
sql
CREATE DATABASE IF NOT EXISTS store
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci;
USE store;
10.2 创建商品表
sql
CREATE TABLE IF NOT EXISTS goods (
id BIGINT COMMENT '商品编号',
name VARCHAR(50) COMMENT '商品名',
unitprice DECIMAL(12, 2) COMMENT '零售单价',
costprice DECIMAL(12, 2) COMMENT '成本价',
category VARCHAR(20) COMMENT '商品类型',
provider VARCHAR(50) COMMENT '供应商'
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_0900_ai_ci;
10.3 创建客户表
sql
CREATE TABLE IF NOT EXISTS customer (
id BIGINT COMMENT '客户编号',
name VARCHAR(20) COMMENT '客户姓名',
gender BOOL COMMENT '性别',
phone_num VARCHAR(20) COMMENT '电话号码',
email VARCHAR(50) COMMENT '电子邮件',
address VARCHAR(255) COMMENT '地址',
create_time DATETIME COMMENT '注册时间'
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_0900_ai_ci;
10.4 创建购买记录表
sql
CREATE TABLE IF NOT EXISTS purchase (
order_id VARCHAR(32) COMMENT '订单编号',
customer_id BIGINT COMMENT '客户编号',
goods_id BIGINT COMMENT '商品编号',
nums INT COMMENT '购买商品数量',
amount DECIMAL(12, 2) COMMENT '总金额',
create_time DATETIME COMMENT '订单生成时间'
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_0900_ai_ci;
10.5 检查创建结果
sql
SHOW TABLES;
DESC goods;
DESC customer;
DESC purchase;
十一、操作流程模板
创建表后的检查流程
sql
CREATE TABLE IF NOT EXISTS 表名 (
字段定义
);
SHOW TABLES;
DESC 表名;
SHOW WARNINGS;
修改表后的检查流程
sql
ALTER TABLE 表名 修改选项;
DESC 表名;
删除表前的确认流程
sql
SHOW TABLES;
DESC 表名;
DROP TABLE IF EXISTS 表名;
SHOW TABLES;
十二、重点记忆
text
查看表:SHOW TABLES
创建表:CREATE TABLE
查看结构:DESC
修改表:ALTER TABLE
删除表:DROP TABLE
text
ADD 添加字段
MODIFY 修改字段定义
RENAME COLUMN 重命名字段
DROP COLUMN 删除字段
RENAME TO 重命名表
删除操作不可只看 SQL 是否能执行,还必须确认目标数据库、目标表和目标字段是否正确。