CREATE TABLE 是 DDL 核心,選項極多。本文拆解標準語法、各子句含義、欄位定義細節、索引與約束定義,助你精準建表。
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition, ...)
[table_options]
[select_statement]
| 選項 | 說明 |
|---|---|
TEMPORARY | 臨時表,Session 結束自動刪除。MySQL 5.6+ 支援存儲過程內使用。 |
IF NOT EXISTS | 避免表已存在報錯,腳本重跑安全。 |
tbl_name | 識別符規則:字母、數字、底線、$;建議小寫+底線。 |
table_options | ENGINE=InnoDB, CHARSET=utf8mb4, AUTO_INCREMENT=100, COMMENT='...' 等。 |
select_statement | CREATE TABLE t2 SELECT * FROM t1 複製結構與資料(不複製索引/約束)。 |
create_definition 詳細語法col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]
[PRIMARY KEY] [COMMENT '...']
[UNIQUE [KEY] | [INDEX] [index_name] (col_name, ...)]
[FOREIGN KEY [index_name] (col_name, ...) REFERENCES ...]
[CHECK (expr)] -- 8.0.16+ 開始強制執行
NOT NULL:預設為 NULL,明確聲明提升查詢優化器判斷。DEFAULT:數值預設 0,字串預設 '',日期預設 '0000-00-00',首個 TIMESTAMP 預設 CURRENT_TIMESTAMP。AUTO_INCREMENT:僅整數型,每表一個,需建索引(通常為 PK)。PRIMARY KEY:隱含 NOT NULL + UNIQUE + 索引。| 語法 | 效果 |
|---|---|
KEY / INDEX idx_name (col) | 普通索引,允許重複值 |
UNIQUE [INDEX] idx_name (col) | 唯一索引,值不可重複(NULL 除外) |
FULLTEXT INDEX idx_name (col) | 全文索引(MyISAM/InnoDB 5.6+) |
SPATIAL INDEX idx_name (col) | 空間索引(幾何型別) |
CONSTRAINT fk_order_user FOREIGN KEY (user_id)
REFERENCES user(id)
ON DELETE CASCADE
ON UPDATE RESTRICT
僅 InnoDB 支援,ON DELETE/UPDATE 可選 CASCADE、SET NULL、RESTRICT、NO ACTION。
CREATE TABLE `order` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '訂單ID',
`user_id` BIGINT UNSIGNED NOT NULL COMMENT '用戶ID',
`order_no` VARCHAR(32) NOT NULL COMMENT '訂單號',
`amount` DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '金額',
`status` TINYINT NOT NULL DEFAULT 0 COMMENT '0待付款 1已付款 2已發貨 3完成 4取消',
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間',
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_order_no` (`order_no`),
KEY `idx_user_id` (`user_id`),
CONSTRAINT `fk_order_user` FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='訂單主表';
` 包裹,防關鍵字衝突(如 order、group)。utf8mb4(支援 Emoji),排序規則 utf8mb4_general_ci 或 utf8mb4_unicode_ci。ENGINE=InnoDB,除非有特殊唯讀分析需求用 MyISAM。AUTO_INCREMENT 起始值可用 table_options 指定:AUTO_INCREMENT=10000。