ALTER TABLE

修改表结构,包括添加列、修改列类型、重命名列和删除列

语法

ALTER TABLE table_name
  ADD COLUMN col_name data_type [constraints]
  | MODIFY COLUMN col_name new_data_type
  | CHANGE COLUMN old_name new_name data_type
  | DROP COLUMN col_name
  | RENAME TO new_table_name;

参数

参数说明示例级别
ADD COLUMN 添加新列 ALTER TABLE users ADD COLUMN phone VARCHAR(20); 常用
MODIFY COLUMN 修改列类型或约束 ALTER TABLE users MODIFY COLUMN phone VARCHAR(30) NOT NULL; 常用
CHANGE COLUMN 重命名列并修改定义 ALTER TABLE users CHANGE COLUMN phone mobile VARCHAR(20); 常用
DROP COLUMN 删除列 ALTER TABLE users DROP COLUMN temp_field; 危险
ADD INDEX 添加索引 ALTER TABLE users ADD INDEX idx_phone (phone); 常用
RENAME TO 重命名表 ALTER TABLE users RENAME TO members; 进阶

示例

添加新列

-- 在指定位置添加列
ALTER TABLE users
  ADD COLUMN phone VARCHAR(20) COMMENT '手机号' AFTER email;

-- 添加多列
ALTER TABLE orders
  ADD COLUMN shipping_fee DECIMAL(8,2) DEFAULT 0.00 AFTER total_amount,
  ADD COLUMN discount_amount DECIMAL(8,2) DEFAULT 0.00 AFTER shipping_fee;
AFTER 指定新列位置,不加则默认在最后

修改列类型

-- 扩大字段长度
ALTER TABLE products
  MODIFY COLUMN description TEXT COMMENT '商品描述';

-- 修改默认值
ALTER TABLE orders
  ALTER COLUMN status SET DEFAULT 0;
缩小字段长度可能导致数据截断,需谨慎

重命名列

-- MySQL 8.0+ 推荐用 RENAME COLUMN
ALTER TABLE users RENAME COLUMN phone TO mobile;

-- MySQL 5.7 用 CHANGE
ALTER TABLE users CHANGE phone mobile VARCHAR(20);
CHANGE 必须重新指定完整的列定义

在线 DDL(大表修改)

-- MySQL 8.0 支持 INSTANT 算法(秒级完成)
ALTER TABLE orders
  ADD COLUMN remark VARCHAR(500),
  ALGORITHM=INSTANT;

-- 不支持 INSTANT 时用 INPLACE
ALTER TABLE orders
  ADD INDEX idx_remark (remark(100)),
  ALGORITHM=INPLACE, LOCK=NONE;
ALGORITHM=INSTANT 不需要重建表,大表也能秒级完成

常见错误

ERROR 1060 (42S21): Duplicate column name 'xxx' 列名已存在,检查是否重复添加
ERROR 1091 (42000): Can't DROP 'xxx'; check that column/key exists 要删除的列或索引不存在,先用 DESC table 确认

技巧

相关命令