高效完成元数据导入
提升工作效率系列。别人还在吭哧吭哧干体力活的时候,你要将重复的工作尽量标准化,流程化,自动化,代码化。腾出更多的时间摸鱼(提升自己打怪升级)
数据治理中,我们经常要将表的字段等信息登记到一个专门维护元数据的平台上,为了提升效率可能会生成 excle 来高效完成。
比如你要导入excle 需要生成,表名称+英文字段名+中文字段名称+字段类型+类型长度+精度长度。
假如是一张 mysql 的建表语句。
ddl 如下:
CREATE TABLE employee_salary (employee_id INT NOT NULL COMMENT '员工ID',name VARCHAR(100) NOT NULL COMMENT '姓名',position VARCHAR(100) NOT NULL COMMENT '职位',base_salary DECIMAL(10, 2) NOT NULL COMMENT '基础工资',bonus DECIMAL(10, 2) NOT NULL COMMENT '奖金',total_salary DECIMAL(10, 2) GENERATED ALWAYS AS (base_salary + bonus) STORED COMMENT '总工资',PRIMARY KEY (employee_id)
) COMMENT='员工工资表';
下方表格是我们要得到excle 格式
表名称 | 英文字段名 | 中文字段名称 | 字段类型喊长度 | 字段类型 | 字段长度 | 字段长度精度 | |
---|---|---|---|---|---|---|---|
employee_salary | employee_id | 员工ID | int | int | 10 | 0 | |
employee_salary | name | 姓名 | varchar(100) | varchar | |||
employee_salary | position | 职位 | varchar(100) | varchar | |||
employee_salary | base_salary | 基础工资 | decimal(10,2) | decimal | 10 | 2 | |
employee_salary | bonus | 奖金 | decimal(10,2) | decimal | 10 | 2 | |
employee_salary | total_salary | 总工资 | decimal(10,2) | decimal | 10 | 2 | |
我们可以将字段信息复制出来,通过 notpad++、ue 等工具,将字段抠出来,然后将表名列复制出来,字段类型拿到后,长度精度列在分离,若果是一张表几张表,感觉是可以这样实现,但是如果,你被分配了几十张上百张表怎么办?聪明的你是不是要想别的办法?如果我能通说 mysql 的连接工具直接生成上图所示的 excle 多好呀!有吗?还真有,其实我们应该了解到,一张表的 ddl 语句也是存在 mysql 中的数据,只不过这张表比较特殊存放的是表的元数据信息。还废话不多说,开始下一步。发现从 INFORMATION_SCHEMA.COLUMNS
表中获取表和字段的元数据信息,包括字段顺序。
具体步骤如下:
步骤概述
- 创建目标表:创建一个表来存储元数据信息。
- 获取表和字段信息:从
INFORMATION_SCHEMA
获取表和字段的元数据信息。 - 将元数据插入目标表:按照表名分组,并按字段顺序将这些信息批量插入到目标表中。
1. 创建目标表
创建一个目标表 metadata_info
来存储表名、字段名、字段中文名、字段类型等信息。
CREATE TABLE metadata_info (id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键',table_name VARCHAR(255) NOT NULL COMMENT '表名',column_name VARCHAR(255) NOT NULL COMMENT '字段名',column_comment VARCHAR(255) COMMENT '字段中文名',column_type VARCHAR(255) COMMENT '字段类型',ordinal_position INT COMMENT '字段顺序'
) COMMENT='数据库表的元数据信息';
2. 获取表和字段信息
从 INFORMATION_SCHEMA.COLUMNS
表中获取表和字段的元数据信息,包括字段顺序。
SELECT TABLE_NAME,COLUMN_NAME,COLUMN_COMMENT,COLUMN_TYPE,ORDINAL_POSITION
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'your_database_name'
ORDER BY TABLE_NAME, ORDINAL_POSITION;
ORDINAL_POSITION
是字段在表中的顺序,TABLE_SCHEMA
替换为你的数据库名。
3. 将元数据插入目标表
将上一步获取到的数据插入到 metadata_info
表中。
INSERT INTO metadata_info (table_name, column_name, column_comment, column_type, ordinal_position)
SELECT TABLE_NAME,COLUMN_NAME,COLUMN_COMMENT,COLUMN_TYPE,ORDINAL_POSITION
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'your_database_name'
ORDER BY TABLE_NAME, ORDINAL_POSITION;
4. 存储过程
为自动化此过程,可以创建一个存储过程。
创建存储过程
DELIMITER $$CREATE PROCEDURE InsertMetadataInfo(IN dbName VARCHAR(255))
BEGINTRUNCATE TABLE metadata_info;INSERT INTO metadata_info (table_name, column_name, column_comment, column_type, ordinal_position)SELECT TABLE_NAME,COLUMN_NAME,COLUMN_COMMENT,COLUMN_TYPE,ORDINAL_POSITIONFROM INFORMATION_SCHEMA.COLUMNSWHERE TABLE_SCHEMA = dbNameORDER BY TABLE_NAME, ORDINAL_POSITION;
END $$DELIMITER ;
调用存储过程
CALL InsertMetadataInfo('your_database_name');
5. 完整的 SQL 示例
假设你的数据库名为 my_database
,目标表名为 metadata_info
,可以按照以下步骤操作:
创建目标表
CREATE TABLE metadata_info (id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键',table_name VARCHAR(255) NOT NULL COMMENT '表名',column_name VARCHAR(255) NOT NULL COMMENT '字段名',column_comment VARCHAR(255) COMMENT '字段中文名',column_type VARCHAR(255) COMMENT '字段类型',ordinal_position INT COMMENT '字段顺序'
) COMMENT='数据库表的元数据信息';
插入数据
INSERT INTO metadata_info (table_name, column_name, column_comment, column_type, ordinal_position)
SELECT TABLE_NAME,COLUMN_NAME,COLUMN_COMMENT,COLUMN_TYPE,ORDINAL_POSITION
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'my_database'
ORDER BY TABLE_NAME, ORDINAL_POSITION;
创建并调用存储过程
sql
复制代码
DELIMITER $$CREATE PROCEDURE InsertMetadataInfo(IN dbName VARCHAR(255))
BEGINTRUNCATE TABLE metadata_info;INSERT INTO metadata_info (table_name, column_name, column_comment, column_type, ordinal_position)SELECT TABLE_NAME,COLUMN_NAME,COLUMN_COMMENT,COLUMN_TYPE,ORDINAL_POSITIONFROM INFORMATION_SCHEMA.COLUMNSWHERE TABLE_SCHEMA = dbNameORDER BY TABLE_NAME, ORDINAL_POSITION;
END $$DELIMITER ;-- 调用存储过程
CALL InsertMetadataInfo('my_database');
6. 验证结果
在插入数据后,你可以查询 metadata_info
表来验证结果是否正确。
SELECT * FROM metadata_info ORDER BY table_name, ordinal_position;
总结
以上步骤详细描述了如何将 MySQL 中的表名、字段名、字段中文名、字段类型等信息批量插入到一个新的表中,并按照表名分组和字段顺序插入。通过创建存储过程,可以使这个过程更加自动化和易于维护。
后续我们也可以做一个前端页面实现交互,直接批量或者单独往一个对话框中丢表名称,自动下载对应的表结构字段信息。