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

相关推荐
坐吃山猪2 小时前
【多线程】Semaphore使用
java·数据库·oracle·多线程
数智启示录2 小时前
PostgreSQL 内存调优实战(第 12 篇):work_mem 只调大 64 倍,峰值为什么远不止 64 倍
运维·数据库·经验分享·postgresql·面试
姜太小白3 小时前
【Oracle】记排查sh脚本调用SQL执行卡顿的排查总结
数据库·sql·oracle
bgy66663 小时前
MariaDB 数据库 基础详解
数据库·mariadb
自动化监测Learner3 小时前
QGIS 把geojson数据导入 PostgreSQL/PostGIS 的完整流程
数据库·postgresql
虎虎(_ _)。゜zzZ3 小时前
Qdrant向量数据库工程实战
数据库·人工智能·大模型·向量数据库·rag·qdrant
ZGG0034 小时前
线程池详解:从 7 大参数到生产避坑
java·数据库·后端
龙亘川4 小时前
数智赋能退役军人服务:V1.0 系统搭建全生命周期闭环服务体系
大数据·数据库·人工智能
zhangguojia74 小时前
权限弹窗点击允许的授权流程
运维·服务器·数据库
jnrjian5 小时前
Postgres 序列(sequence)的权限
数据库·postgresql