萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL ALTER TABLE 修改欄位長度、型別、名稱與索引完整指南

修改欄位長度 / 型別

語法 1:MODIFY COLUMN(推薦,不改名)

ALTER TABLE news MODIFY COLUMN title VARCHAR(130);
ALTER TABLE address MODIFY COLUMN city CHAR(30);

語法 2:CHANGE COLUMN(可同時改名)

ALTER TABLE sms_billbook_tj CHANGE tj_type tj_type VARCHAR(100);
-- 同名時等同 MODIFY

批次修改多欄位

ALTER TABLE tbl
  MODIFY COLUMN col1 VARCHAR(100),
  MODIFY COLUMN col2 INT UNSIGNED,
  CHANGE COLUMN old_name new_name BIGINT;

⚠️ 型別變更風險提示

  • 精度損失:DECIMAL → FLOAT、BIGINT → INT。
  • 資料截斷:VARCHAR(200) → VARCHAR(50) 會截斷超長資料(嚴格模式報錯)。
  • 符號位:INT → INT UNSIGNED 可能導致負數溢位。
  • 索引重建:修改索引欄位型別會觸發全表重建,大表請低峰期操作或使用 pt-online-schema-change。

常用 ALTER 操作速查表

操作SQL 範例備註
刪除欄位ALTER TABLE t DROP col;
新增欄位ALTER TABLE t ADD col INT NOT NULL COMMENT '說明';可加 FIRST / AFTER col2 指定位置
修改欄位型別/屬性ALTER TABLE t CHANGE col col BIGINT NOT NULL COMMENT '說明';同名即為修改屬性
重命名欄位ALTER TABLE t CHANGE old_col new_col INT;
重命名表ALTER TABLE old_t RENAME new_t;等同 RENAME TABLE old_t TO new_t;
刪除主鍵ALTER TABLE t DROP PRIMARY KEY;需先刪除 AUTO_INCREMENT
新增主鍵ALTER TABLE t ADD PRIMARY KEY (id);或複合主鍵 (a,b)
新增普通索引ALTER TABLE t ADD INDEX idx_name (name);
新增唯一索引ALTER TABLE t ADD UNIQUE uk_card (card_no);
刪除索引ALTER TABLE t DROP INDEX idx_name;
新增外鍵ALTER TABLE child ADD CONSTRAINT fk_pid FOREIGN KEY (pid) REFERENCES parent(id);需父表有索引
刪除外鍵ALTER TABLE child DROP FOREIGN KEY fk_pid;
修改表選項ALTER TABLE t ENGINE=InnoDB ROW_FORMAT=DYNAMIC CHARSET=utf8mb4;觸發全表重建

線上變更工具推薦(大表必備)

  • pt-online-schema-change (Percona Toolkit):觸發器+影子表,無鎖變更。
  • gh-ost (GitHub):無觸發器,基於 binlog 同步,更安全。
  • MySQL 8.0+ 部分 DDL 支援 ALGORITHM=INSTANT(如加欄位、刪除虛擬欄位),無需複製表。

驗證變更

SHOW CREATE TABLE tbl\G
DESC tbl;
SHOW INDEX FROM tbl;

總結

MODIFY COLUMN 改型別/長度,CHANGE COLUMN 改名+改型別,索引/主鍵/外鍵有專屬子句。大表變更**務必評估鎖表時間**,優先使用線上變更工具,並做好回滾預案。

copyright © 萬盛學電腦網 all rights reserved