接手一个新项目,已经初步开发并上线了。因开发人员不按规范开发,数据库表中的字段注释基本没有,线上追加注释不方便,最后解决是在测试端生成相应的修改字段的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语句是否更改了字段的类型、长度、字符集等信息。不然影响线上罪过就大了。