CREATE TABLE
创建数据表,定义列、数据类型、约束和索引
语法
CREATE TABLE [IF NOT EXISTS] table_name ( column_name data_type [constraints], ... [INDEX | PRIMARY KEY | UNIQUE | FOREIGN KEY] ) [ENGINE=InnoDB] [DEFAULT CHARSET=utf8mb4];
参数
| 参数 | 说明 | 示例 | 级别 |
|---|---|---|---|
PRIMARY KEY |
主键约束 | id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY |
常用 |
NOT NULL |
非空约束 | username VARCHAR(50) NOT NULL |
常用 |
DEFAULT |
默认值 | status TINYINT DEFAULT 1 |
常用 |
UNIQUE |
唯一约束 | email VARCHAR(100) UNIQUE |
常用 |
FOREIGN KEY |
外键约束 | FOREIGN KEY (user_id) REFERENCES users(id) |
进阶 |
COMMENT |
列注释 | status TINYINT COMMENT '0:禁用 1:启用' |
常用 |
示例
创建用户表
CREATE TABLE IF NOT EXISTS users ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名', email VARCHAR(100) NOT NULL UNIQUE COMMENT '邮箱', password_hash VARCHAR(255) NOT NULL COMMENT '密码哈希', status TINYINT DEFAULT 1 COMMENT '0:禁用 1:启用', created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_email (email), INDEX idx_status (status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
包含自增主键、唯一约束、默认值和索引
创建订单表(含外键)
CREATE TABLE orders ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, order_no VARCHAR(32) NOT NULL UNIQUE COMMENT '订单号', user_id BIGINT UNSIGNED NOT NULL COMMENT '用户ID', total_amount DECIMAL(10,2) NOT NULL DEFAULT 0.00, status TINYINT DEFAULT 0 COMMENT '0:待付款 1:已付款 2:已发货 3:已完成', created_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE RESTRICT, INDEX idx_user_id (user_id), INDEX idx_status_created (status, created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
外键关联用户表,ON DELETE RESTRICT 防止误删
查看表结构
DESC users; SHOW CREATE TABLE users;
DESC 看列信息,SHOW CREATE TABLE 看完整建表语句
创建临时表
CREATE TEMPORARY TABLE tmp_active_users AS SELECT id, username FROM users WHERE status = 1;
临时表在连接断开后自动删除
常见错误
ERROR 1050 (42S01): Table 'users' already exists
使用 CREATE TABLE IF NOT EXISTS 避免重复创建
ERROR 1215 (HY000): Cannot add foreign key constraint
检查外键列和引用列的数据类型是否完全一致(包括 UNSIGNED)
技巧
- 主键推荐用 BIGINT UNSIGNED AUTO_INCREMENT,不要用 UUID 做主键(影响索引性能)
- 金额字段用 DECIMAL 不要用 FLOAT/DOUBLE,避免精度丢失
- 每张表都加 created_at 和 updated_at 字段,方便排查问题