人人都会AI编程

2.3 数据库、数据表基础操作

更新时间:2026-07-11

安装好 MySQL、连上客户端之后,第一个实际问题就是:怎么建库,怎么建表,怎么往里面放数据。这一节不会深入字段类型、索引选择这些高级话题(那些会在第 7 章展开),而是让你能在第一时间把基础的表操作跑通,建立起对数据库对象的直观认识。

2.3.1 数据库的基本操作

在 MySQL 里,“数据库”(Database,也称 Schema)是最高层级的容器。一个 MySQL 实例里可以创建多个库,不同库之间的表互不干扰。通常我们会为每个业务或每个项目分配独立的库。

查看已有数据库

SHOW DATABASES;

执行后会列出所有库,其中包括安装时自动创建的系统库:

  • mysql:存放用户权限、事件、时区等元信息,不要随意改动
  • information_schema:提供数据库元数据的只读视图,比如有哪些表、哪些索引,用于查询信息。
  • performance_schema:性能监控相关数据。
  • sys:以更友好的方式封装了 performance_schema,方便 DBA 巡检。

自己创建的库和系统库混杂在一起,命名时建议用有业务含义的名字,一眼就能区分。

创建数据库

CREATE DATABASE mydb;

这条语句会创建一个名为 mydb 的数据库。实际项目中,为了规避字符集带来的诡异问题,更推荐在创建时显式指定字符集和排序规则:

CREATE DATABASE mydb
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;
  • CHARACTER SET utf8mb4:设为 utf8mb4 而不是 utf8,因为 MySQL 的 utf8 其实是阉割版,最多支持 3 字节,放不了 emoji 表情和部分生僻字。utf8mb4 是事实上的标准选择。
  • COLLATE utf8mb4_unicode_ci:基于 Unicode 的通用排序规则,ci 表示大小写不敏感(case-insensitive)。

如果你所在公司已有统一的字符集规范,就按规范来;如果没有,就记住 utf8mb4 + utf8mb4_unicode_ci 这个搭配。

选择当前数据库

建好库后,后续操作需要指定在哪个库里执行。可以用 USE 语句切换:

USE mydb;

之后所有 DDL 和 DML 语句(建表、查询等)都会默认对这个库生效。如果在图形化工具里,通常双击库名就完成了选择。

删除数据库

DROP DATABASE mydb;

这条命令没有确认提示,一执行整个库下的所有表、数据全部永久消失,而且通常无法通过操作系统的回收站恢复。 生产环境执行前一定要三思,养成先 SELECT DATABASE() 确认当前库的习惯,或者在脚本里做好保护。很多公司会直接回收开发人员的 DROP DATABASE 权限,只给 DBA 保留。

2.3.2 数据表的基本操作

有了库,就可以建表。表是数据落地的具体组织单位,每一张表对应现实中的一类“东西”,比如用户、订单、商品。

创建表

最小化的建表语句:

CREATE TABLE student (
  id INT,
  name VARCHAR(50)
);

这相当于定义了两列:整数型的 id 和最大 50 字符的 name。但既然用到了 MySQL,在实际开发中通常至少会指定主键、设置存储引擎和字符集,比如:

CREATE TABLE student (
  id       INT NOT NULL AUTO_INCREMENT COMMENT '学生ID',
  name     VARCHAR(50) NOT NULL DEFAULT '' COMMENT '姓名',
  gender   TINYINT NOT NULL DEFAULT 0 COMMENT '性别: 1-男, 2-女',
  birthday DATE DEFAULT NULL COMMENT '出生日期',
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生信息表';

关键在于:

  • NOT NULL:避免字段中出现不可预期的 NULL 值,建议只有真正需要“未知”时才用 NULL。
  • AUTO_INCREMENT:自增主键,插入时不给值就自动生成递增整数,方便且常用。
  • COMMENT:给字段和表加上清晰的中英文注释,长期维护时能省下大量沟通成本。
  • ENGINE=InnoDB:显式声明存储引擎,团队统一用 InnoDB,杜绝混用导致的特性不一致。
  • DEFAULT CHARSET=utf8mb4:表级字符集,防止写入中文时乱码。

查看表结构

建完表可以用以下命令查看定义:

DESC student;
-- 或者完整写法
SHOW COLUMNS FROM student;

会列出字段名、类型、是否允许 NULL、键类型、默认值、额外信息(如 auto_increment)等。

如果想看创建这张表时使用的完整 DDL 语句,用:

SHOW CREATE TABLE student;

它会输出包含引擎、字符集、注释等全部信息的创建语句,是排查问题和做文档时的好帮手。

修改表结构

表建好之后再改结构是很常见的,比如加个字段、改个类型。基本语法是 ALTER TABLE

-- 增加列
ALTER TABLE student ADD COLUMN email VARCHAR(100) DEFAULT '' COMMENT '邮箱';

-- 修改列定义(注意:必须重复整个列定义)
ALTER TABLE student MODIFY COLUMN name VARCHAR(100) NOT NULL DEFAULT '' COMMENT '姓名';

-- 删除列
ALTER TABLE student DROP COLUMN email;

-- 重命名列(同时可修改定义)
ALTER TABLE student CHANGE COLUMN name student_name VARCHAR(100) NOT NULL DEFAULT '' COMMENT '姓名';

在线业务中执行 DDL 有一个很重要的点:某些修改(如修改字段类型、加索引)在 MySQL 5.7 及以前版本会锁表,导致写入阻塞。 MySQL 8.0 的 Instant DDL 和 Online DDL 大大缓解了这个问题,但在生产环境做表结构变更,仍然建议放在业务低峰期,并评估表大小和操作影响。不要直接在线上不做任何准备就 ALTER TABLE

删除表与清空表

-- 删除表本身及数据
DROP TABLE student;

-- 仅清空表中所有数据,保留表结构,效率远高于逐行 DELETE
TRUNCATE TABLE student;

DROP TABLE 是彻底消失,和 DROP DATABASE 一样没有后悔药。TRUNCATE 无法指定 WHERE 条件,会把表清得干干净净,且不会触发 DELETE 触发器,自增计数器也会重置。如果只是删除部分数据,请用 DELETE FROM student WHERE ...

查看库中有哪些表

SHOW TABLES;

这条命令列出当前库下的所有表名,相当于在图形化工具左侧看到的那一列图标。

2.3.3 几点立即能用上的实用建议

  1. 从一开始就用 utf8mb4,不要给未来留乱码坑。
  2. 建表语句带上注释,写清楚字段含义和状态值映射。你三个月后回来维护代码,一定会感谢自己。
  3. 存储引擎统一 InnoDB,除非你有非常明确且理解后果的理由才用其他引擎。
  4. 生产环境不要随意 DROP 或 ALTER,先确认影响范围,走变更流程,保持敬畏。
  5. 用 SHOW CREATE TABLE 保存建表语句,比截图 DESC 更准确完整。

把这几条基础操作练熟,你就在 MySQL 里有了“建仓库、搭货架”的能力。下一节会讲到基本的 SQL 分类(DDL、DML、DQL、DCL、TCL),让你知道每条语句在数据库世界里属于哪一类,各自负责什么。