首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL ALTER TABLE 完整操作指南:重命名、欄位增刪改、索引與約束管理

     編輯:MySQL 綜合教學

語法總覽

ALTER TABLE [IGNORE] tbl_name
    [alter_specification [, alter_specification] ...]

alter_specification:
    RENAME TO new_tbl_name
  | RENAME [COLUMN] old_col_name TO new_col_name
  | ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name]
  | DROP [COLUMN] col_name
  | MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]
  | CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST | AFEND col_name]
  | ADD PRIMARY KEY (col_name, ...)
  | ADD UNIQUE [INDEX|KEY] [index_name] (col_name, ...)
  | ADD INDEX [index_name] (col_name, ...)
  | ADD FULLTEXT [INDEX|KEY] [index_name] (col_name, ...)
  | ADD FOREIGN KEY [index_name] (col_name, ...) REFERENCES tbl_name (col_name, ...)
  | DROP PRIMARY KEY
  | DROP INDEX index_name
  | DROP FOREIGN KEY fk_symbol

1. 表層級操作

重命名資料表

ALTER TABLE student RENAME TO s;
-- 或使用獨立指令(可一次改多表)
RENAME TABLE s TO student, old2 TO new2;

調整資料排序(物理重組)

ALTER TABLE student ORDER BY stu_id DESC;

注意:InnoDB 會按主鍵聚簇儲存,ORDER BY 僅對 MyISAM/MEMORY 有實質效果;InnoDB 8.0+ 已移除此選項。

2. 欄位層級操作

新增欄位

ALTER TABLE student ADD sex CHAR(1) AFTER stu_name;
-- 預設值處理:NOT NULL 欄位會依型別填預設值 (數值 0、字串 ''、日期 '0000-00-00')

刪除欄位

ALTER TABLE student DROP sex;

修改欄位定義

需求語法備註
改型別、長度、預設值、NOT NULLMODIFY col_name new_definition欄位名不變
改名 + 可能改型別CHANGE old_name new_name new_definition需完整重寫定義
移動欄位位置在 MODIFY/CHANGE 後加 FIRST 或 AFTER col僅調整邏輯順序
-- 將 stu_tel 改為 tel CHAR(3) 並移至 stu_score 之後
ALTER TABLE student CHANGE stu_tel tel CHAR(3) AFTER stu_score;

-- 僅改型別回 INT
ALTER TABLE student MODIFY tel INT(3);

3. 完整性約束操作

-- 主鍵
ALTER TABLE student DROP PRIMARY KEY;
ALTER TABLE student ADD PRIMARY KEY (stu_id);

-- 唯一索引
ALTER TABLE student ADD UNIQUE uk_email (email);

-- 外鍵
ALTER TABLE orders
  ADD CONSTRAINT fk_orders_user
  FOREIGN KEY (user_id) REFERENCES users(id)
  ON DELETE CASCADE ON UPDATE CASCADE;

-- 刪除外鍵(需知道 constraint 名稱)
ALTER TABLE orders DROP FOREIGN KEY fk_orders_user;

4. 線上 DDL (Online DDL) 提示

  • MySQL 5.6+ 大部分 ALTER TABLE 支援 ALGORITHM=INPLACE,不鎖表、不拷貝全表。
  • 強制拷貝操作:CHANGE COLUMN 改型別、ADD PRIMARY KEY (5.6)、CONVERT TO CHARACTER SET。
  • 生產環境建議加上 ALGORITHM=INPLACE, LOCK=NONE 並在低峰期執行。

5. 常見錯誤與對策

錯誤訊息原因解決
ERROR 1025 (HY000): Error on rename外鍵約束阻礙先 DROP FOREIGN KEY 再操作
ERROR 1833 (HY000): Cannot change column欄位參與外鍵/分區移除相依物件後再改
Lock wait timeout exceeded長時間佔用 metadata lock縮短交易、避開高峰、升級 8.0 享受 Instant DDL
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved