批量修改字段默认值必须用alter table modify column拼接完整定义,不可只写default;需查information_schema.columns并显式指定类型、null约束、默认值、注释、字符集等全部属性,避免约束丢失或降级。

直接用 ALTER TABLE MODIFY COLUMN 批量生成 SQL
不能靠一条 ALTER TABLE 语句改遍全库,必须先查出目标字段,再拼出可执行的修改语句。核心是查 INFORMATION_SCHEMA.COLUMNS,用 CONCAT 构造 ALTER TABLE ... MODIFY COLUMN 语句。
常见错误是只写 DEFAULT,漏掉字段完整定义——MySQL 会把没写的属性(比如 NOT NULL、类型长度)重置为默认值,导致数据约束意外丢失。
- 必须显式写出字段完整定义:类型、是否允许
NULL、默认值、注释(如有) - 如果原字段是
NOT NULL且无默认值,加DEFAULT时必须保留NOT NULL,否则该字段变成允许NULL - 字段类型长度别缩写,比如
VARCHAR(255)不能简写成VARCHAR,否则可能被降级为VARCHAR(1)
示例:给所有 mall_% 库中表的 status 字段统一设默认值 'normal',且保持 VARCHAR(20) NOT NULL:
SELECT CONCAT('ALTER TABLE `', TABLE_SCHEMA, '`.`', TABLE_NAME, '` MODIFY COLUMN `', COLUMN_NAME, '` VARCHAR(20) NOT NULL DEFAULT \'normal\' COMMENT "', COLUMN_COMMENT, '";') AS sql_stmt
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA LIKE 'mall_%'
AND COLUMN_NAME = 'status'
AND DATA_TYPE = 'varchar';
用存储过程自动执行批量修改(慎用)
手动复制执行拼出的 SQL 是最安全的方式;真要用存储过程自动跑,得自己加事务控制和错误捕获,否则中途失败会导致部分表改了、部分没改,状态不一致。
存储过程本身不校验语法合法性,拼错的 ALTER 语句会直接报错中断,且无法回滚已执行的部分(ALTER TABLE 是隐式提交)。
- 不要在生产环境直接运行未经验证的存储过程
- 务必先在测试库执行一遍生成的 SQL,确认无误再导出到生产环境
- 如果字段有索引或外键依赖,
MODIFY COLUMN可能触发表重建,大表会锁表,需评估影响
ALTER COLUMN SET DEFAULT 不适用于批量场景
ALTER TABLE ... ALTER COLUMN ... SET DEFAULT 语法虽然存在,但它只能改单个字段,且**不保留原有类型和约束定义**——它只动默认值,其他属性不变。但问题在于:它无法用于批量生成,也不能跨表使用,更不能和 MODIFY COLUMN 混用。
实际中几乎没人用它做批量操作,因为:
- 它不支持一次改多个字段(哪怕在同一张表)
- 它不能在
SELECT ... CONCAT(...)中拼接使用(语法不兼容) - 某些 MySQL 版本(如 5.7)对
ALTER COLUMN支持不完整,容易报错ERROR 1064
所以别被文档误导——批量改默认值,MODIFY COLUMN 是唯一可靠路径。
字段类型变更 + 默认值要一步到位
如果既要改默认值,又要改类型(比如 decimal → bigint),千万别分两步:先改类型再改默认值。因为第一步改类型后,原默认值可能失效或被清空,第二步再设默认值时,字段定义已变,容易漏掉 NOT NULL 或长度等细节。
正确做法是:在拼 MODIFY COLUMN 语句时,一次性写出新类型 + 新默认值 + 所有原始约束。
- 查
COLUMNS表时,把IS_NULLABLE、COLLATION_NAME、COLUMN_COMMENT全部带上,避免遗漏 - 对
datetime类型字段设默认值,注意 MySQL 5.7+ 才支持CURRENT_TIMESTAMP作为DEFAULT,旧版本要用DEFAULT '0000-00-00 00:00:00' - 字符集和排序规则(
COLLATE)若与原字段不同,也得显式写进MODIFY语句里,否则会被重置
真正麻烦的不是怎么写 SQL,而是确认每一张表里那个字段的真实定义——少写一个 NOT NULL,或者漏掉 COLLATE utf8mb4_unicode_ci,都可能让应用写入失败或产生乱码。动手前,先抽样 SHOW CREATE TABLE 几张表核对字段细节,比事后修 bug 省力得多。











