Skip to content

2026-08-29 · MySQL 学习笔记 02

MySQL 数据类型与建库建表

1. 常用数据类型(只学这些)

类型用途例子
INT整数,主键、数量、次数库存 100
BIGINT大整数,订单号、流水号、雪花 ID6688200000012304
TINYINT小整数,状态、开关、区分 0/1/2订单状态 0待支付 1已支付 2已退款
VARCHAR(n)变长字符串,名称、手机号、编码'可乐'、'13800000001'
DECIMAL(10,2)金额,钱必须用它3.50
DATETIME日期时间,创建时间、更新时间2026-08-29 06:13:08
DATE只存日期2026-08-29

三个判断原则:

  • 金额用 DECIMAL,绝不用 FLOAT/DOUBLE——浮点数存钱会有精度误差;
  • 文本长度够用就好——VARCHAR(50) 够的不要 VARCHAR(255),越长越占空间越慢;
  • 状态用数字枚举,不用字符串——status TINYINT(0/1/2),比 'PAID'/'UNPAID' 省空间也快。

TEXT(长文本)工作里偶尔遇到,记个名即可,不常用。

2. 建库

sql
CREATE DATABASE 库名 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

utf8mb4 是必须的:完整的 UTF-8,支持中文和 emoji。字符集错了会出现乱码和"⁇"。

3. 建表(核心)

sql
CREATE TABLE goods (
  id INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
  name VARCHAR(50) NOT NULL COMMENT '商品名',
  price DECIMAL(10,2) NOT NULL COMMENT '单价',
  stock INT NOT NULL DEFAULT 0 COMMENT '库存',
  category VARCHAR(20) COMMENT '分类',
  create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
) COMMENT '商品表';

逐行拆解必须看懂的写法:

写法作用
id INT PRIMARY KEY AUTO_INCREMENT主键,自增,每条记录唯一编号
NOT NULL这列不能为空,插入时必须给值
DEFAULT 0不给值时用默认 0
DEFAULT CURRENT_TIMESTAMP插入时自动填当前时间,建表必备
COMMENT '商品名'列注释,别人(包括你俩月后的自己)看表就懂

几条规定(团队里就这么写的):

  • 表名、列名全小写下划线create_time,不写 CreateTimecreateTime
  • 每张表必须有主键,统一叫 id
  • 通用三件套:idcreate_timeupdate_time(需要时加,update_time 可加 ON UPDATE CURRENT_TIMESTAMP 自动更新);
  • 能加注释就加。

4. 表结构相关

sql
SHOW TABLES;                -- 看库里所有表
DESC goods;                 -- 看表结构(列名、类型、主键、默认值)
SHOW CREATE TABLE goods;    -- 看建表完整 SQL(别人给的库就用这个看)
DROP TABLE goods;           -- 删表(慎用,数据没了)

5. 改表结构(很少用,但要知道)

sql
-- 加一列
ALTER TABLE goods ADD COLUMN 产地 VARCHAR(20) COMMENT '产地' AFTER name;

-- 删一列
ALTER TABLE goods DROP COLUMN 产地;

-- 改列类型
ALTER TABLE goods MODIFY COLUMN name VARCHAR(100) NOT NULL COMMENT '商品名';

实际项目里改表更常通过 MyBatis-Plus / 迁移工具管,手写 DDL 学会看懂即可。

6. 一个完整示例

便利店会员表:

sql
CREATE TABLE member (
  id INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
  name VARCHAR(20) NOT NULL COMMENT '姓名',
  phone VARCHAR(11) UNIQUE COMMENT '手机号',
  level TINYINT NOT NULL DEFAULT 1 COMMENT '等级 1普通 2银卡 3金卡',
  balance DECIMAL(10,2) NOT NULL DEFAULT 0 COMMENT '余额',
  create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
) COMMENT '会员表';

UNIQUE 唯一约束:这一列的值不能重复(同一手机号只准注册一次)。