ALTER TABLE MODIFY 会清空原有列注释,因其本质是重建列定义,未显式指定 COMMENT 即等价于 COMMENT '';正确做法是使用 CHANGE 或在 MODIFY 中显式写出完整列定义及 COMMENT。

ALTER TABLE MODIFY 会清空原有列注释
直接用 ALTER TABLE ... MODIFY 修改列定义时,即使没动 COMMENT,MySQL 也会把原有注释丢掉。这不是 bug,是语法设计:MODIFY 本质是“重建列定义”,不显式带上 COMMENT 就等价于 COMMENT ''。
常见错误现象:
原列有注释,执行 ALTER TABLE t1 MODIFY COLUMN name VARCHAR(50) 后,SHOW FULL COLUMNS FROM t1 显示 Comment 字段为空。
- 必须在
MODIFY语句里**显式重写整个列定义 + 原注释或新注释** - 如果只改类型不改注释,得先查出原注释(比如从
information_schema.COLUMNS)再拼进去 - 注意字符集、排序规则、是否允许 NULL 等属性也会被重置,漏写会导致行为变更
正确做法:用 CHANGE 或 MODIFY 并带完整定义和 COMMENT
想安全加注释,优先用 CHANGE(语义更清晰),或者确保 MODIFY 包含全部列属性。核心是:**注释不是可选补丁,而是列定义的一部分**。
示例(给已有列 status 添加注释):
ALTER TABLE orders CHANGE COLUMN status status TINYINT NOT NULL COMMENT '0=待处理,1=已完成,2=已取消';
如果坚持用 MODIFY,也得写全:
ALTER TABLE orders MODIFY COLUMN status TINYINT NOT NULL COMMENT '0=待处理,1=已完成,2=已取消';
-
CHANGE和MODIFY在仅改注释时效果一致,但CHANGE要求重复写列名两次,MODIFY少写一次——别为省字数牺牲可读性 - 如果列有默认值、自增、生成列等属性,这些都得一并写进语句,否则会被移除
- MySQL 5.7+ 支持
COMMENT,但老版本(如 5.6)对长注释或某些数据类型支持不稳,建议先测
批量加注释?别手写 ALTER,用 information_schema 生成语句
给几十个列挨个写 ALTER 容易漏、易错。真实场景下,应该从元数据动态生成 SQL,而不是硬编码。
查出所有需要加注释的列(比如当前没注释但字段名含 _at 的时间戳列):
SELECT CONCAT('ALTER TABLE `', table_name, '` MODIFY COLUMN `', column_name, '` ', column_type,
IF(is_nullable = 'YES', ' NULL', ' NOT NULL'),
IF(column_default IS NOT NULL, CONCAT(' DEFAULT ', QUOTE(column_default)), ''),
' COMMENT \'', '记录', column_name, '时间\'') AS ddl
FROM information_schema.COLUMNS
WHERE table_schema = 'your_db'
AND table_name = 'your_table'
AND column_name LIKE '%_at'
AND (column_comment IS NULL OR column_comment = '');
- 输出的是可执行的
ALTER语句,复制粘贴就能跑 - 注意
column_type不包含长度单位(如varchar(10)里的(10)),要用正则或应用层补全 - 生成的语句不含事务控制,大表操作前务必在低峰期执行,并确认有备份
COMMENT 不是文档替代品,别指望它解决所有可读性问题
列注释在 SHOW CREATE TABLE 和部分 ORM 工具里能显示,但很多 DBA 工具、BI 连接器、甚至 MySQL 官方客户端(如 mysql CLI)默认不展示 Comment 字段。
- 业务逻辑强相关的说明(比如状态码映射、取值约束)更适合写进建表 SQL 注释块或单独维护的数据字典
- 注释内容长度限制 1024 字符(MySQL 8.0),超长会被截断,且不报错
- ALTER 操作会锁表(尤其 MyISAM 或老版本 InnoDB),加注释看似轻量,但在大表上可能阻塞写入几秒到几分钟
真正容易被忽略的是:注释不会自动同步到下游系统。ETL 脚本、报表字段描述、API 文档,全都得另外维护——别以为加了 COMMENT 就一劳永逸。


















