Appearance
2026-08-29 · MySQL 学习笔记 02
MySQL 数据类型与建库建表
1. 常用数据类型(只学这些)
| 类型 | 用途 | 例子 |
|---|---|---|
INT | 整数,主键、数量、次数 | 库存 100 |
BIGINT | 大整数,订单号、流水号、雪花 ID | 6688200000012304 |
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,不写CreateTime、createTime; - 每张表必须有主键,统一叫
id; - 通用三件套:
id、create_time、update_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 唯一约束:这一列的值不能重复(同一手机号只准注册一次)。