首页/数据/数据库速查/CREATE TABLE 建表语法与设计要点
SQL 语法52 条

CREATE TABLE 建表语法与设计要点

定义列、类型、约束、索引与表选项;InnoDB + utf8mb4 是默认组合,主键与聚簇索引设计直接决定后续性能。

数据库速查数据更新于 2026-10-13

建表语句是什么

建表语句定义列、类型、约束、索引与表选项,是数据模型落到存储的起点。稳妥的默认组合是 InnoDB 引擎加 utf8mb4 字符集,兼顾事务与四字节字符。真正决定后续性能的是主键设计:InnoDB 的主键就是聚簇索引,数据按主键顺序存放,主键选得不好,插入与查询代价都会持续上升。

基本信息

用途定义表结构、约束与索引
核心要素列类型、非空约束、默认值、主键、索引、引擎与字符集
推荐组合InnoDB 加 utf8mb4
主键要点主键即聚簇索引,决定数据物理顺序
金额类型用定点小数,避免浮点误差
时间类型日期时间类型不随时区转换,时间戳类型会随会话时区变化

典型使用场景

  • 新业务建模:确定表结构与主键
  • 分表拆分:按同一模板批量建表
  • 归档表:结构与主表保持一致,便于数据搬迁
  • 日志与流水表:按时间维度设计索引
  • 测试环境复制结构:只建结构不导数据

完整示例

完整示例
CREATE TABLE orders (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  user_id BIGINT UNSIGNED NOT NULL,
  sku VARCHAR(64) NOT NULL,
  qty INT NOT NULL DEFAULT 1,
  amount DECIMAL(12,2) NOT NULL DEFAULT 0.00,
  status TINYINT NOT NULL DEFAULT 0,
  created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  KEY idx_user_created (user_id, created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;   # 引擎与字符集显式写出

复制结构与查看

复制结构与查看
SHOW CREATE TABLE orders\G   # 拿到完整定义,含索引与表选项
CREATE TABLE orders_bak LIKE orders;   # 只复制结构,索引一并带上

设计要点

项目推荐做法原因
主键使用有序且紧凑的类型主键即聚簇索引,随机主键造成页分裂
金额使用定点小数浮点有精度误差,对账会出问题
时间需要时区转换时用时间戳类型日期时间类型不随会话时区变化
字符集统一使用 utf8mb4四字节字符不会写入失败
字符串长度按业务实际需求设定过长浪费内存,过短会截断或报错
默认值给非空列配默认值避免写入时因缺值报错
金额用定点小数而不是浮点:浮点在累加与比较时带误差,财务对账必然出问题,这是数据模型阶段代价最高的返工之一。
主键避免用随机字符串:随机主键会让插入位置分散,引发页分裂与索引膨胀,用有序且短的类型更划算。
字符串长度要按需设置:过小会导致写入截断或报错,过大则浪费内存——临时表与排序内存按最大长度分配,宽字段会显著放大内存开销。

建表检查清单

  • 显式写出引擎与字符集,不依赖服务端默认值
  • 主键类型与业务增长量匹配
  • 为常用查询条件预留复合索引
  • 字段注释写清含义,便于后续维护
  • 上线前用真实数据量评估表大小与索引数量
表结构一旦承载数据,改动成本就明显上升:加列通常较容易,改列类型与主键往往需要重建表,因此建模阶段多花半小时核对,能省掉后期数小时的停机改造。

易错点

  • 省略引擎与字符集:不同环境默认值不同,迁移后出现乱码或引擎不一致
  • 用随机字符串做主键:插入位置分散、页分裂严重,写入性能随数据量下降
  • 金额列使用浮点类型:累加与比较带误差,财务报表对不上
  • 字段长度随手写得很宽:临时表与排序内存按最大长度分配,整体内存开销上升

数据来源与参考

  • MySQL 8.0 Reference Manual: CREATE TABLE Statement

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌