資料表結構的定義與維護是資料庫開發的核心技能。MySQL 提供豐富的 DDL 語句,支援資料表建立、刪除、修改與索引管理。本文系統整理 CREATE TABLE、DROP TABLE、ALTER TABLE、CREATE/DROP INDEX 的語法、選項與實務技巧。
CREATE TABLE [IF NOT EXISTS] table_name (
column_definitions,
[index_definitions],
[table_options]
) [SELECT_statement];
MySQL 3.23+ 支援在建表時指定儲存引擎:
CREATE TABLE t (id INT) ENGINE = InnoDB;
CREATE TABLE t (id INT) ENGINE = MyISAM;
CREATE TABLE t (id INT) ENGINE = MEMORY; -- 舊稱 HEAP
三大引擎特性比較:
| 特性 | MyISAM | InnoDB | MEMORY |
|---|---|---|---|
| 交易支援 | 否 | 是 (ACID) | 否 |
| 行級鎖定 | 否 (表級) | 是 | 否 |
| 外鍵 | 否 | 是 | 否 |
| 全文索引 | 是 (5.6+ InnoDB 也支援) | 5.6+ | 否 |
| 資料持久化 | 是 | 是 | 否 (重啟消失) |
| 適用場景 | 唯讀/多讀少寫、全文搜尋 | 高併發、交易系統 | 暫存表、快取、查找表 |
CREATE TABLE IF NOT EXISTS users (id INT PRIMARY KEY, name VARCHAR(50));
適用於部署腳本、批次作業,確保冪等性。
CREATE TEMPORARY TABLE temp_session (user_id INT, data TEXT);
DROP-- 複製結構與資料
CREATE TABLE backup_users SELECT * FROM users;
-- 僅複製結構(WHERE 條件永假)
CREATE TABLE empty_users SELECT * FROM users WHERE 0;
-- 建立臨時表進行實驗
CREATE TEMPORARY TABLE test_users SELECT * FROM users;
優點:自動推斷欄位型別、複製索引(主鍵需手動加回)、單指令完成。
-- 基本刪除
DROP TABLE table_name;
-- 同時刪除多張表
DROP TABLE t1, t2, t3;
-- 安全刪除(不存在不報錯)
DROP TABLE IF EXISTS table_name;
IF EXISTS 同樣適用於部署腳本,避免首次執行失敗。
-- 1. CREATE INDEX (MySQL 內部映射為 ALTER TABLE)
CREATE INDEX idx_name ON users(name(10));
CREATE UNIQUE INDEX uk_email ON users(email);
-- 2. ALTER TABLE (最常用,支援一次建多個)
ALTER TABLE users
ADD INDEX idx_name (name(10)),
ADD UNIQUE uk_email (email),
ADD PRIMARY KEY (id);
-- 3. CREATE TABLE 時同步建立
CREATE TABLE users (
id INT NOT NULL,
name VARCHAR(50),
email VARCHAR(100),
PRIMARY KEY (id),
INDEX idx_name (name(10)),
UNIQUE uk_email (email)
);
對長字串欄位(CHAR、VARCHAR、BLOB、TEXT)建立索引時,可指定前綴長度:
CREATE INDEX idx_content ON articles(content(100));
DROP INDEX idx_name ON users;
ALTER TABLE users DROP INDEX idx_name;
ALTER TABLE users DROP PRIMARY KEY; -- 刪除主鍵
-- 重命名表
ALTER TABLE old_name RENAME TO new_name;
-- 新增欄位
ALTER TABLE users ADD COLUMN age TINYINT UNSIGNED NOT NULL DEFAULT 0;
-- 新增欄位並指定位置
ALTER TABLE users ADD COLUMN phone VARCHAR(20) AFTER email;
ALTER TABLE users ADD COLUMN created_at TIMESTAMP FIRST;
-- 修改欄位型別/屬性
ALTER TABLE users MODIFY COLUMN name VARCHAR(100) NOT NULL;
ALTER TABLE users CHANGE COLUMN old_name new_name VARCHAR(100) NOT NULL;
-- 刪除欄位
ALTER TABLE users DROP COLUMN deprecated_field;
-- 變更儲存引擎
ALTER TABLE users ENGINE = InnoDB;
-- 調整 AUTO_INCREMENT 起始值
ALTER TABLE users AUTO_INCREMENT = 10000;
MySQL 要求單次 ALTER TABLE 必須同時轉換所有可變長欄位,否則會自動轉回:
-- 正確:一次轉換所有 VARCHAR
ALTER TABLE t
MODIFY c1 CHAR(50),
MODIFY c2 CHAR(100);
-- 錯誤:分兩次執行,第一次執行後會被自動轉回 VARCHAR
ALTER TABLE t MODIFY c1 CHAR(50);
ALTER TABLE t MODIFY c2 CHAR(100);
連接欄位型別一致可大幅提升 JOIN 效能:
-- t1.name CHAR(10), t2.name CHAR(15) → 統一為 CHAR(15)
ALTER TABLE t1 MODIFY name CHAR(15);
掌握 MySQL DDL 語句的完整語法與特性,能讓資料庫結構演進更從容。建議搭配 SHOW CREATE TABLE、EXPLAIN 驗證結構與索引效果,打造高效能的資料模型。