ALTER TABLE 添加字段卡住是因为MySQL默认需重建整表,大表耗时长且锁表;InnoDB 5.6+仅末尾ADD COLUMN支持在线操作,AFTER/FIRST或NOT NULL无DEFAULT会触发拷贝或报错。

直接改,但得知道哪条语句动哪块、锁多久、会不会丢数据。
ALTER TABLE 添加字段时为什么有时卡住?
不是语法错了,而是 MySQL 在执行 ALTER TABLE ... ADD COLUMN 时,默认会重建整张表(尤其在旧版本或非 InnoDB 引擎下),表越大越慢;5.6+ 的 InnoDB 支持「在线 DDL」,但仅限部分操作——ADD COLUMN 在末尾添加且不指定 AFTER 或 FIRST 时才是真正的 online 操作。
- 加字段加在最后:用
ADD COLUMN即可,基本不锁表(InnoDB 5.6+) - 想插到某个字段后面:必须用
AFTER 已有字段,这会触发表拷贝,大表慎用 - 没加
NOT NULL且没给DEFAULT值:MySQL 会为历史行填NULL,没问题;但如果加了NOT NULL又没给DEFAULT,会报错ERROR 1138: Invalid use of NULL value
修改字段类型或重命名字段,MODIFY 和 CHANGE 有什么区别?
MODIFY COLUMN 只改类型/约束,不改名;CHANGE COLUMN 必须写两次字段名(旧名 + 新名),哪怕名字不变也要重复写——它本质是「删旧列 + 加新列」,所以哪怕只改类型也建议优先用 MODIFY,更轻量。
- 只改长度或加注释:
ALTER TABLE users MODIFY COLUMN email VARCHAR(255) COMMENT '主邮箱' - 要改名又改类型:
ALTER TABLE users CHANGE COLUMN mobile phone VARCHAR(20) - 只改名不改类型:
ALTER TABLE users CHANGE COLUMN user_name username VARCHAR(50)——注意,类型不能省,否则报错
生产环境执行 ALTER TABLE 前必须检查的三件事
不是跑完 SQL 就完事,很多线上事故就栽在这几步漏掉。
- 查字段是否存在:
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'users' AND COLUMN_NAME = 'phone',避免重复ADD COLUMN报错 - 确认表大小和引擎:
SELECT TABLE_NAME, ENGINE, DATA_LENGTH FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'users',如果DATA_LENGTH超过 1GB,别直接跑ALTER,考虑用pt-online-schema-change或选低峰期 - 备份表结构而非数据:
SHOW CREATE TABLE users\G存下来,比 mysqldump 整表快得多,出错时能秒级还原建表语句
真正麻烦的不是语法,是字段加进去之后应用代码没适配、ORM 没 reload schema、或者默认值逻辑和业务预期不一致——这些不会报错,但会让数据慢慢变脏。


















