Mysql 使用【information_schema.COLUMNS】批量修改表字段注释

       接手一个新项目,已经初步开发并上线了。因开发人员不按规范开发,数据库表中的字段注释基本没有,线上追加注释不方便,最后解决是在测试端生成相应的修改字段的Sql语句来同步线上的字段保证线上、线下数据库表、字段注释、字段信息统一。

1、获取所有列信息(COLUMNS)

SELECT  *  FROM information_schema.COLUMNS WHERE  TABLE_SCHEMA='数据库名';  COLUMNS表:提供了关于表中的列的信息。详细表述了某个列属于哪个表。各字段说明如下:

字段含义
table_schema 表所有者(对于schema的名称)
table_name 表名
column_name 列名
ordinal_position 列标识号
column_default 列的默认值
is_nullable 列的为空性。如果列允许 null,那么该列返回 yes。否则,返回 no
data_type 系统提供的数据类型
character_maximum_length以字符为单位的最大长度,适于二进制数据、字符数据,或者文本和图像数据。否则,返回 null。有关更多信息,请参见数据类型
character_octet_length 以字节为单位的最大长度,适于二进制数据、字符数据,或者文本和图像数据。否则,返回 nu
numeric_precision 近似数字数据、精确数字数据、整型数据或货币数据的精度。否则,返回 null
numeric_precision_radix 近似数字数据、精确数字数据、整型数据或货币数据的精度基数。否则,返回 null
numeric_scale 近似数字数据、精确数字数据、整数数据或货币数据的小数位数。否则,返回 null
datetime_precision datetime 及 sql-92 interval 数据类型的子类型代码。对于其它数据类型,返回 null
character_set_catalog 如果列是字符数据或 text 数据类型,那么返回 master,指明字符集所在的数据库。否则,返回 null
character_set_schema 如果列是字符数据或 text 数据类型,那么返回 dbo,指明字符集的所有者名称。否则,返回 null
character_set_name 如果该列是字符数据或 text 数据类型,那么为字符集返回唯一的名称。否则,返回 null
collation_catalog 如果列是字符数据或 text 数据类型,那么返回 master,指明在其中定义排序次序的数据库。否则此列为 null
collation_schema 返回 dbo,为字符数据或 text 数据类型指明排序次序的所有者。否则,返回 null
collation_name 如果列是字符数据或 text 数据类型,那么为排序次序返回唯一的名称。否则,返回 null。
domain_catalog 如果列是一种用户定义数据类型,那么该列是某个数据库名称,在该数据库名中创建了这种用户定义数据类型。否则,返回 null
domain_schema 如果列是一种用户定义数据类型,那么该列是这种用户定义数据类型的创建者。否则,返回 null
domain_name 如果列是一种用户定义数据类型,那么该列是这种用户定义数据类型的名称。否则,返回 NULL

 

 

2、新建立一张测试表,字段中增加常用的字段类型

create table test_columns(  
    id    int primary key auto_increment,  
    col_tinyint tinyint(1),
    col_char char(20) not null default '0'  comment 'col_char的注释',  
    col_date    date default '2021-05-21' comment 'col_date类型测试',  
    col_varchar varchar(20) not null default '' ,  
    col_bigint  bigint ,  
    col_text text comment 'text',  
    col_timestamp    timestamp not null default current_timestamp on update current_timestamp,  
    col_time datetime not null default now()  
);  

3、给新建立的表增加注释信息

CREATE TABLE `test_columns` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `col_tinyint` tinyint(1) DEFAULT NULL COMMENT 'col_tinyint的注释',
  `col_char` char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '0' COMMENT 'col_char的注释',
  `col_date` date DEFAULT '2021-05-21' COMMENT 'col_date类型测试',
  `col_varchar` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT 'col_varchar的注释',
  `col_bigint` bigint(20) DEFAULT NULL COMMENT 'col_bigint的注释',
  `col_text` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT 'col_text的注释',
  `col_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'col_timestamp的注释',
  `col_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'col_time的注释',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

4、通过【COLUMNS】生成 test_columns 表的modify 相关Sql语句

SELECT     
concat(    
    'alter table ',     
    table_schema, '.', table_name,     
    ' modify column ', column_name, ' ', column_type, ' ',     
    if(is_nullable = 'YES', ' ', 'not null '),     
    if(column_default IS NULL, '',     
        if(    
            data_type IN ('char', 'varchar')     
            OR     
            data_type IN ('date', 'datetime', 'timestamp') AND column_default != 'CURRENT_TIMESTAMP',     
            concat(' default ''', column_default,''''),     
            concat(' default ', column_default)    
        )    
    ),     
    if(extra is null or extra='','',concat(' ',extra)),  
    ' comment ''', column_comment, ''';'    
) s    
FROM information_schema.columns    
WHERE table_schema = 'col_test'  --   col_test 为测试的数据库名称
    AND   table_name = 'test_columns'  -- test_columns 为 测试的表名称 

5、执行第4步的sql语句得到以下修改字段语句

alter table col_test.test_columns modify column id int(11) not null  auto_increment comment '主键ID';
alter table col_test.test_columns modify column col_tinyint tinyint(1)   comment 'col_tinyint的注释';
alter table col_test.test_columns modify column col_char char(20) not null  default '0' comment 'col_char的注释';
alter table col_test.test_columns modify column col_date date   default '2021-05-21' comment 'col_date类型测试';
alter table col_test.test_columns modify column col_varchar varchar(20) not null  default '' comment 'col_varchar的注释';
alter table col_test.test_columns modify column col_bigint bigint(20)   comment 'col_bigint的注释';
alter table col_test.test_columns modify column col_text text   comment 'col_text的注释';
alter table col_test.test_columns modify column col_timestamp timestamp not null  default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP comment 'col_timestamp的注释';
alter table col_test.test_columns modify column col_time datetime not null  default CURRENT_TIMESTAMP comment 'col_time的注释';

  这样 就可以把修改表字段语句给到生产环境的同学使用了,在生成环境执行之前最好对照下sql语句是否更改了字段的类型、长度、字符集等信息。不然影响线上罪过就大了。

一定要检查!!!

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值