本文简介
写本文主要是围绕下面几点进行的。
1、information_schema数据库到底是做什么用的?
2、执行alter table 表名 modify column 字段名 类型 这个sql时,mysql发生了什么?
3、修改字段基本的sql记录【修改字段长度,修改字段名称,修改字段类型,默认值,是否空,字段说明,还有什么?】
正文
最近系统报一个错,字段设置为varchar(20),实际传入参数长度大于20,然后需要更改系统中所有库下的关于相关字段的长度,数据表有两百多个,假如一个个的查表找字段,我估计不能按时完成任务。怎么办?自己琢磨着难道mysql就没有记录所有的库的信息这个功能吗?一查果然有,就是这个库information_schema,给赞!
其实在自己安装mysql数据库的时候,会经常见到这个库,到底这个库是做什么用的,就没有再进一步了解过,今天遇到了,好好看一下。
其实对于上面的很多表中表示的是什么意思,目前都还不是很了解的,后续查资料,尽量补充一下。
这次我使用的表就是这个库下的COLUMNS表,这个表记录了详细的表中各字段的所属及类型,提供信息足够我使用,下面就是处理的sql。
处理sql:
select a.TABLE_SCHEMA as 库名,a.TABLE_NAME as 表名,a.COLUMN_NAME as 列名,
case when a.COLUMN_DEFAULT = '0' then '0' else '\'\'' end as 默认值,
case when a.IS_NULLABLE = 'NO' then 'not null' else 'null' end as 是否允许空,
a.COLUMN_TYPE as 列类型 ,a.COLUMN_COMMENT as 说明
from `COLUMNS` a
where
(a.COLUMN_NAME like '%mount%' or a.COLUMN_NAME like '%price%' or a.COLUMN_NAME like '%fee%')
and a.DATA_TYPE = 'varchar' and a.CHARACTER_MAXIMUM_LENGTH < 50
and a.TABLE_SCHEMA in(
'db_acc_v2',
'db_buz_v2',
'db_inv_v2',
'db_nc_v2',
'db_pay_v2',
'db_pro_v2',
'db_settle_v2'); # 拼接 修改sql
select CONCAT('alter table ',a.TABLE_SCHEMA,'.',a.TABLE_NAME,' modify column '
,a.COLUMN_NAME,' VARCHAR(50) ',case when a.is_nullable='NO' then 'not null' else 'null' end
,' DEFAULT ',case when a.COLUMN_DEFAULT is null then ' null ' else CONCAT('\'',a.COLUMN_DEFAULT,'\'') end
,' COMMENT ',case when a.COLUMN_COMMENT is null then ' null ' else CONCAT('\'',a.COLUMN_COMMENT,'\'') end,';')
from `COLUMNS` a
where (a.COLUMN_NAME like '%mount%' or a.COLUMN_NAME like '%price%' or a.COLUMN_NAME like '%fee%')
and a.DATA_TYPE = 'varchar' and a.CHARACTER_MAXIMUM_LENGTH < 50
and a.TABLE_SCHEMA in(
'db_acc_v2',
'db_buz_v2',
'db_inv_v2',
'db_nc_v2',
'db_pay_v2',
'db_pro_v2',
'db_settle_v2')
order by a.TABLE_SCHEMA,a.TABLE_NAME,a.COLUMN_NAME;
后记:
书中自有黄金屋,书中自有颜如玉呀,多读书,多实践,多写好代码!