掌握 DESC、SHOW CREATE TABLE、ALTER TABLE 全語法,是高效進行 Schema 管理的核心技能。本文系統整理查看方法、修改語法、大表策略與最佳實踐。
DESC product;
-- 或
DESCRIBE product;
-- 或
SHOW COLUMNS FROM product;
輸出解讀:Field、Type、Null、Key (PRI/UNI/MUL)、Default、Extra (auto_increment/on update CURRENT_TIMESTAMP)
SHOW CREATE TABLE bm\G;
*************************** 1. row ***************************
Table: bm
Create Table: CREATE TABLE `bm` (
`id` int(11) NOT NULL,
`name` varchar(22) DEFAULT NULL,
`location` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `STH` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
關鍵信息:引擎、字符集、自增值、索引定義、外鍵、分區、註釋
SELECT COLUMN_NAME, DATA_TYPE, COLUMN_KEY, IS_NULLABLE, COLUMN_DEFAULT, EXTRA
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA='db' AND TABLE_NAME='tbl';
ALTER TABLE old_name RENAME [TO] new_name;
ALTER TABLE bm RENAME department;
ALTER TABLE tbl MODIFY col NEW_TYPE;
ALTER TABLE department MODIFY id VARCHAR(11);
ALTER TABLE tbl CHANGE old_col new_col NEW_TYPE;
ALTER TABLE employees CHANGE location loc VARCHAR(350);
ALTER TABLE tbl ADD col TYPE [CONSTRAINTS] [FIRST|AFTER exist_col];
ALTER TABLE employees ADD manager_id INT(10);
ALTER TABLE employees ADD age INT(11) NOT NULL;
ALTER TABLE employees ADD sal FLOAT FIRST;
ALTER TABLE employees ADD hire_date DATE AFTER manager_id;
ALTER TABLE tbl DROP col;
ALTER TABLE employees DROP manager_id;
ALTER TABLE employees DROP hire_date;
ALTER TABLE tbl MODIFY col TYPE FIRST|AFTER other_col;
ALTER TABLE employees MODIFY name VARCHAR(22) FIRST;
ALTER TABLE department MODIFY location VARCHAR(350) AFTER department_id;
ALTER TABLE tbl ENGINE=NewEngine;
ALTER TABLE department ENGINE=MyISAM;
-- 主流引擎: InnoDB, MyISAM, MEMORY, ARCHIVE, CSV, BLACKHOLE, FEDERATED
ALTER TABLE tbl DROP FOREIGN KEY fk_name;
ALTER TABLE employees DROP FOREIGN KEY fk_emp_dept;
DROP TABLE [IF EXISTS] tbl1, tbl2, ...;
DROP TABLE IF EXISTS employees;
-- 建立測試場景
CREATE DATABASE rm_tab;
USE rm_tab;
CREATE TABLE department (id INT PRIMARY KEY, name VARCHAR(22), location VARCHAR(200));
CREATE TABLE employee (id INT PRIMARY KEY, name VARCHAR(25), department_id INT, salary FLOAT,
CONSTRAINT fk_emp_dept FOREIGN KEY (department_id) REFERENCES department(id));
-- 直接刪除主表失敗
DROP TABLE department; -- ERROR 1217
-- 正確流程
ALTER TABLE employee DROP FOREIGN KEY fk_emp_dept;
DROP TABLE department; -- 成功
| 策略 | 適用場景 | 工具/語法 | 優點 | 缺點 |
|---|---|---|---|---|
| 原生 DDL | 小表、維護窗口、可接受鎖表 | ALTER TABLE ... | 簡單、原子性 | 長時間鎖表、不可中斷 |
| Online DDL (5.6+) | InnoDB 添加/刪除索引、修改列屬性 | ALGORITHM=INPLACE, LOCK=NONE | 無鎖/輕量鎖 | 不支持所有操作、需滿足條件 |
| pt-online-schema-change | 大表、無維護窗口、業務零停機 | pt-osc --alter "..." D=db,t=tbl --execute | 完全在線、可控、可回滾 | 需額外工具、觸發器開銷、雙倍空間 |
| 影子表雙寫 | 極大表、極高可用性要求 | 應用層雙寫 + 同步校驗 + 切換 | 完全業務可控 | 開發成本極高、雙寫一致性難保證 |
-- 完全在線 (INPLACE, LOCK=NONE)
ALTER TABLE tbl ADD INDEX idx_col (col), ALGORITHM=INPLACE, LOCK=NONE;
ALTER TABLE tbl DROP INDEX idx_col, ALGORITHM=INPLACE, LOCK=NONE;
ALTER TABLE tbl MODIFY col VARCHAR(100), ALGORITHM=INPLACE, LOCK=NONE; -- 類型擴大
-- 允許共享鎖 (INPLACE, LOCK=SHARED)
ALTER TABLE tbl ADD COLUMN col INT, ALGORITHM=INPLACE, LOCK=SHARED;
-- 僅複製表 (COPY, 鎖表)
ALTER TABLE tbl CHANGE col new_col BIGINT, ALGORITHM=COPY; -- 類型縮小、重命名
ALGORITHM/LOCK、避免隱式 COPYThreads_running、Innodb_row_lock_waits、磁盤空間SHOW CREATE TABLE、索引統計 ANALYZE TABLE、應用冒煙測試表結構變更是資料庫生命周期中的高風險操作。理解鎖行為、選擇適合策略、建立標準化流程,將 DDL 從「恐怖故事」轉化為「可控的工程實踐」。