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 确认
技巧
- 大表 ALTER 可能锁表很久,生产环境用 pt-online-schema-change 或 gh-ost 工具
- MySQL 8.0 的 INSTANT DDL 可以秒级添加列,优先使用
- 修改列类型前先检查现有数据是否兼容新类型