MySQL中能否直接更新information_schema.COLUMNS替代ALTER TABLE修改列属性
问题答复
你提到的直接UPDATE修改
information_schema.COLUMNS的操作完全不能替代ALTER TABLE语句,甚至本身就是错误不可执行的。
- 首先,
information_schema是数据库提供的系统元数据视图,本身是只读的,没有写入权限,你直接执行这段UPDATE语句会直接触发权限报错,根本运行不起来。 - 其次,就算你通过特殊的底层配置绕过了视图写入限制,修改这个视图的内容也不会触发表结构的实际变更:这个视图只是把底层存储的表元数据查出来展示给你,改视图本身不会修改底层真实的表结构定义,后续操作数据表时还是会按原有的非空约束校验,不会达到你要修改字段为允许空的效果。
正确的批量修改方案
你要批量处理多个表的字段修改需求,正确的做法是先从information_schema查询符合条件的字段,自动生成对应的ALTER TABLE语句,再批量执行生成的语句即可,以MySQL为例参考代码如下:
-- 生成所有需要修改的ALTER TABLE语句 SELECT CONCAT( 'ALTER TABLE `', TABLE_NAME, '` ', 'MODIFY COLUMN `', COLUMN_NAME, '` ', COLUMN_TYPE, ' NULL', IF(COLUMN_DEFAULT IS NOT NULL, CONCAT(' DEFAULT ', QUOTE(COLUMN_DEFAULT)), ''), ';' ) AS alter_sql FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = '替换为你的数据库名' -- 按需添加筛选条件,比如只改非空字段、只改特定命名规则的字段等 AND IS_NULLABLE = 'NO';
执行上述查询后,把返回的所有ALTER语句复制出来逐一执行,就能批量完成字段属性修改。
注意事项
- DDL操作会锁表,建议在业务低峰期执行,大表操作前要预估执行时间,避免影响线上业务
- 操作前务必备份全量表结构和数据,避免修改错误导致数据异常
内容的提问来源于stack exchange,提问作者Jage
相关产品推荐
相关产品推荐

