大表加注释只锁元数据(mdl),不锁全表;但若字段定义不一致(如漏写not null、default等),会退化为copy-alter并触发全表锁。

大表加注释会锁表吗
会,但只锁元数据(MDL),不是全表锁。MySQL 5.6+ 对 ALTER TABLE ... MODIFY COLUMN 这类操作默认走“instant DDL”路径时,如果只改 COMMENT 且字段定义完全不变(类型、约束、默认值、自增等全部一致),理论上可免物理重建——但实际是否生效,取决于 MySQL 版本和字段定义的“严格一致性”。一旦漏写 NOT NULL 或 DEFAULT,就会退化为 copy-alter,触发全表拷贝和写锁。
如何安全地给大表字段加注释
核心原则:不靠肉眼核对,用 information_schema.COLUMNS 动态生成语句,确保字段定义零偏差。
- 先查原字段完整定义:
SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_DEFAULT, EXTRA, COLUMN_COMMENT FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'your_db' AND TABLE_NAME = 'big_table' AND COLUMN_NAME = 'target_col';
- 拼接
MODIFY COLUMN语句时,必须包含所有非默认属性:比如IS_NULLABLE = 'NO'就得补NOT NULL;EXTRA = 'auto_increment'就得写AUTO_INCREMENT;COLUMN_DEFAULT是字符串就用DEFAULT 'xxx',是NULL就写DEFAULT NULL - 特别注意顺序:
AUTO_INCREMENT必须在COMMENT前面,否则语法报错;COMMENT必须紧贴类型与约束之后,中间不能换行或空格(部分版本容忍空格但不保证) - 执行前用
SHOW CREATE TABLE big_table对比确认原定义,避免因字符集、存储引擎隐式转换导致意外重建
为什么 SHOW FULL COLUMNS 查到的 COMMENT 是空的
不是没生效,是缓存或权限问题。常见原因:
-
SHOW FULL COLUMNS返回的Comment列名首字母大写,容易被脚本忽略(比如用row['comment']取值失败) - 用户没有
SELECT权限访问information_schema.COLUMNS,导致部分客户端工具 fallback 到不准确的元数据源 - 字段注释刚加完,但连接未刷新(尤其用连接池时),建议执行
FLUSH TABLES或重连 - 真正可靠的检查方式只有两种:
SELECT COLUMN_COMMENT FROM information_schema.COLUMNS或SHOW CREATE TABLE的输出文本
批量加注释时最容易丢的三个东西
手写几十条 ALTER TABLE 最常翻车的不是语法,而是这三项:
-
NOT NULL/NULL状态:原字段是NOT NULL,语句里漏写,结果变成允许NULL -
DEFAULT值:原字段有DEFAULT CURRENT_TIMESTAMP,新语句没带上,下次插入就报错或填NULL - 原有
COMMENT内容:想“追加说明”,却用新COMMENT覆盖了旧内容,历史信息彻底丢失
真正稳妥的做法是:从 information_schema 查出当前 COLUMN_COMMENT,用字符串拼接保留原内容,再追加新说明,而不是直接覆盖。











