CREATE TABLE 看似簡單,但**主鍵選擇、字符集、引擎、自增、外鍵、索引**等決策直接決定後續性能與維護成本。本文系統覆蓋 **通用 SQL 語法、命令行實操、PHP mysqli/PDO 代碼、刪表操作**,並給出生產環境建表核對清單。
CREATE TABLE table_name (
col_name col_type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [COMMENT 'comment'],
...
PRIMARY KEY (col_name),
KEY idx_name (col_name),
CONSTRAINT fk_name FOREIGN KEY (col_name) REFERENCES parent_tbl(parent_col)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE tutorials_tbl (
tutorial_id INT NOT NULL AUTO_INCREMENT,
tutorial_title VARCHAR(100) NOT NULL,
tutorial_author VARCHAR(40) NOT NULL,
submission_date DATE,
PRIMARY KEY (tutorial_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
解析:
NOT NULL:業務必填欄位加約束,防止臟數據。AUTO_INCREMENT:代理主鍵自增,**無業務意義**,避免主鍵更新導致聚簇索引重組。PRIMARY KEY:聚簇索引鍵,InnoDB 必須有 PK (無則隱式 6 字節 row_id)。ENGINE=InnoDB:事務、行鎖、外鍵、崩潰恢復。CHARSET=utf8mb4:完整 Unicode 支援。mysql -u root -p
USE tutorials;
CREATE TABLE tutorials_tbl (
tutorial_id INT NOT NULL AUTO_INCREMENT,
tutorial_title VARCHAR(100) NOT NULL,
tutorial_author VARCHAR(40) NOT NULL,
submission_date DATE,
PRIMARY KEY (tutorial_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
# Query OK, 0 rows affected (0.16 sec)
$mysqli = new mysqli('localhost', 'root', 'rootpassword', 'tutorials');
$sql = "CREATE TABLE tutorials_tbl (
tutorial_id INT NOT NULL AUTO_INCREMENT,
tutorial_title VARCHAR(100) NOT NULL,
tutorial_author VARCHAR(40) NOT NULL,
submission_date DATE,
PRIMARY KEY (tutorial_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";
if ($mysqli->query($sql)) {
echo "表創建成功";
} else {
die("創建失敗: " . $mysqli->error);
}
$mysqli->close();
DROP TABLE tutorials_tbl; -- 立即執行,數據不可恢復
$mysqli->query("DROP TABLE tutorials_tbl");
生產環境禁用 DROP TABLE**;改用 RENAME TABLE tbl TO tbl_bak_20231015 歸檔,經驗證無誤後再清理。
| 檢查項 | 標準 | 原因 |
|---|---|---|
| 引擎 | InnoDB | 事務、行鎖、外鍵、恢復 |
| 字符集 | utf8mb4 | 完整 Unicode、Emoji |
| 主鍵 | 無業務意義 BIGINT/UNSIGNED AUTO_INCREMENT | 避免 PK 更新、聚簇索引碎片 |
| NOT NULL | 業務必填欄位全部加 | 約束前移、減少應用層判空 |
| DEFAULT | 非空欄位給合理默認值 | 避免 INSERT 報錯、業務邏輯簡化 |
| COMMENT | 每表、每欄位必寫中文註釋 | 數據字典自動化、團隊協作 |
| 索引 | 高頻 WHERE/JOIN/ORDER BY 欄位建組合索引 | 查詢性能、最左前綴 |
| 外鍵 | 核心業務關係加 FK (或應用層維護) | 參照完整性、防臟數據 |
| 分區 | 超大表 (億級) 按時間/哈希分區 | 裁剪掃描、維護窗口 |
**建表即定規則**,一張設計良好的表能支撐業務平穩演進 3-5 年。遵循 **InnoDB + utf8mb4 + 代理 PK + NOT NULL + DEFAULT + COMMENT + 組合索引** 十字真言,配合上線前核對清單,將 Schema 治理前置,避免「上線後加欄位鎖表、改字符集重建、補索引長時間佔用鎖」等典型事故。