接手一个新项目,已经初步开发并上线了。因开发人员不按规范开发,数据库表中的字段注释基本没有,线上追加注释不方便,最后解决是在测试端生成相应的修改字段的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、给新建立的表增加注释信息

mysql修改注释 mysql修改字段注释便捷方法_mysql

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语句得到以下修改字段语句

mysql修改注释 mysql修改字段注释便捷方法_mysql修改注释_02

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语句是否更改了字段的类型、长度、字符集等信息。不然影响线上罪过就大了。

一定要检查!!!