MySQL表的操作_知识文档

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;

不写 FIRSTAFTER 时,新字段默认添加到表的末尾。


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 CHARVARCHAR 使用混淆

  • 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 是否能执行,还必须确认目标数据库、目标表和目标字段是否正确。

相关推荐
2603_965148116 小时前
如何解析JSON数据?API返回的商品信息处理教程
开发语言·数据库·python·自动化·json·api
ltl6 小时前
RocksDB 经典故障排查:L0、compaction 与 write stall
数据库
xfhuangfu7 小时前
Oracle中建立到CDB和PDB的连接
数据库·oracle·rpc
小小龙学IT7 小时前
DuckDB 深度实战:用 C++ 在进程内跑一个「分析型数据库」
数据库·c++
NineData7 小时前
DTCC 2026 预告|NineData CEO& 创始人叶正盛:面向 AI Agent 的数据库 DevOps 与数据复制实践
数据库·人工智能·数据库开发·devops·ninedata·数据库技术·dtcc
J_bean8 小时前
MySQL 事务是否必须手动开启?
数据库·mysql·数据库事务·自动提交·手动提交
J_bean8 小时前
MySQL InnoDB 如何检测死锁、判定死锁、处理死锁
数据库·mysql·死锁·死锁检测·处理死锁·死锁判定
浪子明X9 小时前
从 MongoDB 文档到关系模型:构建可重跑、可对账的数据迁移流水线
数据库·mongodb·oracle
杜子不疼.9 小时前
国产数据库撑起固井软件自主化:金仓 × 中海油服「海恒 Cemsol」落地解析
数据库
隔窗听雨眠9 小时前
GBase 8s并发控制深度解析:封锁机制、隔离级别与死锁处理全攻略
服务器·数据库·oracle