針對 MySQL 常用 DDL 操作,提供最小可用語法範例,涵蓋預設值、自增、重命名、類型變更、增刪欄位、外鍵/主鍵管理、引擎指定、多表批次刪除。
-- 預設值
CREATE TABLE emp (
id INT DEFAULT 12
);
-- 自增主鍵 (InnoDB 必須是索引列)
CREATE TABLE emp (
id INT PRIMARY KEY AUTO_INCREMENT
) AUTO_INCREMENT = 100; -- 種子值
-- 指定引擎
CREATE TABLE test (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
data0 VARCHAR(20),
data1 VARCHAR(20),
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- MyISAM 範例
CREATE TABLE test_myisam (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(10) NOT NULL
) ENGINE=MyISAM AUTO_INCREMENT=100;
DESC emp;
SHOW CREATE TABLE emp\G
ALTER TABLE emp RENAME emp2;
ALTER TABLE emp2 MODIFY id BIGINT;
-- 只改名
ALTER TABLE emp2 CHANGE id id BIGINT;
-- 改名 + 改類型
ALTER TABLE emp2 CHANGE id emp_id BIGINT UNSIGNED;
ALTER TABLE emp2 ADD name VARCHAR(200) NULL;
ALTER TABLE emp2 DROP name;
-- 外鍵
ALTER TABLE emp2 DROP FOREIGN KEY fk_emp_dept;
-- 主鍵
ALTER TABLE emp2 DROP PRIMARY KEY;
DROP TABLE emp2;
DROP TABLE IF EXISTS emp1, emp2; -- 批次
-- 查看下一個自增值
SHOW TABLE STATUS LIKE 'emp'\G
-- 或
SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA='db' AND TABLE_NAME='emp';
-- 重置自增值 (表必須為空或新值 > 現有最大值)
ALTER TABLE emp AUTO_INCREMENT = 1000;
-- 1. 特定表
SELECT MAX(id) FROM person;
-- 2. 函數 (Session 級)
SELECT LAST_INSERT_ID();
-- 3. 系統變數 (Session 級,連線未斷)
SELECT @@identity;
-- 4. 表狀態
SHOW TABLE STATUS LIKE 'person'\G
| 場景 | MyISAM | InnoDB |
|---|---|---|
| 插入 10 筆 → 刪除 8,9,10 → 重啟 MySQL → 再插入 | 新 ID = 11 (持久化在 .MYD) | 新 ID = 8 (只在記憶體,重啟丟失) |
結語:DDL 語法看似簡單,但「自增種子/步長、引擎差異、CHANGE 必須帶類型、批次刪表、線上安全變更」等細節直接關係生產穩定。建議將常用片段封裝為遷移腳本 (Flyway/Liquibase),實現版本化、可回滾、可審計的結構變更流程。