一、查看表結構
DESC tbl;
SHOW CREATE TABLE tbl;
二、修改表名
ALTER TABLE old_name RENAME new_name;
-- 或
RENAME TABLE old_name TO new_name;
三、列操作
| 操作 | 語法 | 範例 |
| 增加列 | ADD COLUMN col_def | ALTER TABLE t ADD COLUMN email VARCHAR(100) NOT NULL; |
| 增加多列 | ADD COLUMN c1 def, ADD COLUMN c2 def | ALTER TABLE t ADD COLUMN a INT, ADD COLUMN b VARCHAR(20); |
| 刪除列 | DROP COLUMN col | ALTER TABLE t DROP COLUMN old_col; |
| 修改列名 + 類型 | CHANGE old_col new_col new_def | ALTER TABLE t CHANGE name full_name VARCHAR(50); |
| 僅修改類型/屬性 | MODIFY col new_def | ALTER TABLE t MODIFY name VARCHAR(100) NOT NULL; |
CHANGE 必須給新列名(可同名),MODIFY 僅改定義。修改列類型可能觸發表重建,大表慎操作。
四、跨資料庫修改列名語法差異
-- MySQL
ALTER TABLE t CHANGE old_col new_col INT;
-- SQL Server
EXEC sp_rename 't.old_col', 'new_col', 'COLUMN';
-- Oracle
ALTER TABLE t RENAME COLUMN old_col TO new_col;
五、主鍵約束
-- 增加(若表無 PK)
ALTER TABLE t ADD PRIMARY KEY (id);
-- 或命名約束
ALTER TABLE t ADD CONSTRAINT pk_t PRIMARY KEY (id);
-- 刪除
ALTER TABLE t DROP PRIMARY KEY;
六、外鍵約束
-- 增加
ALTER TABLE child
ADD CONSTRAINT fk_child_parent
FOREIGN KEY (parent_id) REFERENCES parent(id);
-- 刪除(需約束名,區分大小寫)
ALTER TABLE child DROP FOREIGN KEY fk_child_parent;
七、索引管理
-- 建立普通索引
ALTER TABLE t ADD INDEX idx_name (name);
CREATE INDEX idx_name ON t (name);
-- 建立唯一索引
ALTER TABLE t ADD UNIQUE INDEX uk_email (email);
CREATE UNIQUE INDEX uk_email ON t (email);
-- 刪除
DROP INDEX idx_name ON t;
ALTER TABLE t DROP INDEX idx_name;
八、常用組合操作範例
-- 重建主鍵(先刪後加)
ALTER TABLE t DROP PRIMARY KEY;
ALTER TABLE t ADD PRIMARY KEY (id);
-- 修改列名 + 類型
ALTER TABLE wd_express CHANGE COLUMN express_id id INT;
-- 增加主鍵
ALTER TABLE wd_express ADD PRIMARY KEY (id);
-- 修改列類型
ALTER TABLE t MODIFY address CHAR(10);
-- 或
ALTER TABLE t CHANGE address address CHAR(40);
九、避坑提醒
- 大表 DDL 鎖表:5.6+ 支援
ALGORITHM=INPLACE、LOCK=NONE,或用 pt-online-schema-change/gh-ost 線上變更。
CHANGE 修改列名時若不指定完整定義,舊屬性(NOT NULL、DEFAULT 等)可能丟失,建議寫全 CHANGE old new VARCHAR(50) NOT NULL DEFAULT ''。
- 外鍵約束名在
information_schema.TABLE_CONSTRAINTS 查詢,刪除時必須精確大小寫。