CREATE TABLE 看似基礎,實則蘊含「存儲引擎選型」「字符集規範」「主鍵/索引佈局」「臨時表隔離」「LIKE 克隆」「SELECT 派生」等工程化決策。本文系統梳理全語法變體、核心選項語義、實戰建模模板與避坑指南,助您寫出**規範、高效、可演進**的建表腳本。
CREATE TABLE person (
number INT(11),
name VARCHAR(255),
birthday DATE
);
CREATE TABLE IF NOT EXISTS `person` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
`number` INT(11) NOT NULL DEFAULT 0 COMMENT '業務編號',
`name` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '姓名',
`birthday` DATE DEFAULT NULL COMMENT '出生日期',
`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_number` (`number`),
KEY `idx_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='人員信息表';
IF NOT EXISTS:幂等部署守護神
CREATE TABLE IF NOT EXISTS person2 (...);
CREATE ... SELECT 時無論表是否存在,SELECT 結果都會插入。
CREATE TEMPORARY TABLE temp_person (
number INT(11),
name VARCHAR(255),
birthday DATE
);
CREATE TEMPORARY TABLES 權限。LIKE 克隆:結構完美複製(含索引/約束/屬性)
CREATE TABLE new_tbl LIKE orig_tbl;
SELECT 派生:結構+數據一鍵複製 / 列投影重塑
-- 全量複製結構與數據(索引/約束/屬性**不複製**,僅列定義+數據)
CREATE TABLE new_tbl SELECT * FROM orig_tbl;
-- 指定列投影+別名重塑
CREATE TABLE foo (a TINYINT NOT NULL) SELECT b+1 AS a FROM bar;
-- 列定義在前,SELECT 派生列在後(附加在右側)
CREATE TABLE bar (m INT) SELECT n FROM foo;
-- 結果:bar(m, n) m 為 NULL(無默認值), n 來自 foo
LIKE 克隆骨架,SELECT 複製血肉(但丟失索引/約束)。CREATE TABLE new LIKE old; INSERT INTO new SELECT * FROM old;(保留索引/約束)。
CREATE TABLE `people` (
`peopleid` SMALLINT(6) NOT NULL AUTO_INCREMENT,
`firstname` CHAR(50) NOT NULL,
`lastname` CHAR(50) NOT NULL,
`age` SMALLINT(6) NOT NULL,
`townid` SMALLINT(6) NOT NULL,
PRIMARY KEY (`peopleid`),
UNIQUE KEY `uk_fname_lname` (`firstname`, `lastname`),
KEY `idx_fname_lname_age` (`firstname`, `lastname`, `age`)
);
peopleid 自增。firstname+lastname 業務唯一鍵。WHERE firstname=? AND lastname=? AND age=? 及最左前綴查詢。
-- 顯示建表語句(含引擎、字符集、AUTO_INCREMENT 等)
SHOW CREATE TABLE person;
-- 顯示所有列詳細信息(類型、排序規則、NULL、鍵、默認值、額外屬性、權限、註釋)
SHOW FULL COLUMNS FROM person;
-- 直接刪除(表不存在報錯)
DROP TABLE tbl_name;
-- 幂等刪除(表不存在不報錯,部署腳本推薦)
DROP TABLE IF EXISTS tbl_name;
-- 同時刪除多表
DROP TABLE IF EXISTS t1, t2, t3;
DROP TABLE 釋放磁碟空間、移除數據字典條目、失效相關權限/觸發器/視圖引用。innodb_file_per_table=ON 時,對應 `.ibd` 文件同步刪除。| 陷阱 | 後果 | 規避 |
|---|---|---|
使用 utf8 而非 utf8mb4 | Emoji/生僻字存儲報錯/截斷 | 全庫表統一 utf8mb4 |
| 無顯式主鍵 | InnoDB 隱式 6 字節 Row ID,寫入熱點、複製不穩 | 強制 BIGINT UNSIGNED AUTO_INCREMENT PK |
SELECT * 派生建表 | 丟失索引/約束/默認值/自增/註釋 | 用 LIKE 克隆 + INSERT SELECT |
| 臨時表與永久表同名 | 永久表被隱藏,易誤操作 | 臨時表命名規範 tmp_ |
大表無 IF NOT EXISTS 重複部署 | 腳本報錯中斷 | 所有 DDL 腳本幂等化 |
| 字符集不一致導致隱式轉換 | 索引失效、排序異常 | 庫/表/列/連接統一 utf8mb4 |
-- V1.0.1__create_person_table.sql
CREATE TABLE IF NOT EXISTS `person` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`number` INT(11) NOT NULL DEFAULT 0 COMMENT '工號',
`name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '姓名',
`birthday` DATE DEFAULT NULL COMMENT '生日',
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_number` (`number`),
KEY `idx_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='人員主檔';
-- 回滾腳本
-- DROP TABLE IF EXISTS `person`;
建表非一時之舉,乃數據架構基石。從「顯式約束」到「utf8mb4 統一」,從「LIKE 克隆骨架」到「SELECT 派生血肉」,從「臨時表隔離」到「幂等部署腳本」——每一個細節都在為**數據質量、演進靈活性、運維可控性**鋪路。願本文攻略助您在建模筆下,落筆生花、行穩致遠。