mysql同步两个环境的数据库表备注

在mysql数据库中存在一个information_scheam数据库用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列的数据类型、访问权限等。

information_schema中的表实际上是视图,而不是基本表,因此,文件系统上没有与之相关的文件。

SCHEMATA 表

当前 mysql 实例中所有数据库的信息。SHOW DATABASES; 命令从这个表获取数据。

TABLES 表

存储数据库中的表信息(包括视图),包括表属于哪个数据库,表的类型、存储引擎、创建时间等信息。SHOW TABLES FROM XX; 命令从这个表获取结果。

SELECT * FROM TABLES;可以查到所有表的信息。

COLUMNS 表

存储表中的列信息,包括表有多少列、每个列的类型等。SHOW COLUMNS FROM schemaname.tablename 命令从这个表获取结果。

SELECT * FROM COLUMNS LIMIT 2,5;

知道了这些基本信息就可以理解以下代码:

package org.example;

import com.mysql.jdbc.StringUtils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;


import java.sql.*;
import java.util.HashMap;

public class Main {
    /*
     * @Description //TODO 同步数据库表备注
     * @Param [args]
     * @return void
     **/
    public static void main(String[] args) throws ClassNotFoundException, SQLException {


        String historyTable = "ibms_brm_eqm_eqd_9000tpm_history";//有备注的表
        String alterTableName = "ibms_brm_eqm_eqd_9000tpm";//没有备注的表(需要修改的表)
        String dataBase = "zj";//数据库名

        String JDBC_Driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/"+dataBase+"?allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE&useSSL=false";
        String user = "root";
        String pwd = "root";

        try {
            Class.forName(JDBC_Driver);
            try (
                    Connection conn = DriverManager.getConnection(url, user, pwd);
                    Statement tatement = conn.createStatement();
                    Statement tatement1 = conn.createStatement();
                    Statement tatement2 = conn.createStatement();
            ) {
                ResultSet history = tatement.executeQuery(
                        " SELECT  COLUMN_NAME , COLUMN_TYPE ,  COLUMN_COMMENT " +
                                " FROM  INFORMATION_SCHEMA.COLUMNS  " +
                                " WHERE  TABLE_SCHEMA = '"+dataBase+"'   AND TABLE_NAME = '" + historyTable + "';"
                );
                ResultSet resource = tatement1.executeQuery(
                        " SELECT  COLUMN_NAME , COLUMN_TYPE ,  COLUMN_COMMENT " +
                                " FROM  INFORMATION_SCHEMA.COLUMNS  " +
                                " WHERE  TABLE_SCHEMA = '"+dataBase+"'   AND TABLE_NAME = '" + alterTableName + "';"
                );
                HashMap<String, String> map = new HashMap<>();
                while (resource.next()) {
                    String dataType_resource = resource.getString("COLUMN_TYPE");
                    String columnName_resource = resource.getString("column_name");
                    map.put(columnName_resource, dataType_resource);
                }
                // 生成更新生产环境表的SQL语句并执行
                while (history.next()) {
                    String dataType_history = history.getString("COLUMN_TYPE");
                    String columnName_history = history.getString("column_name");
                    String columnComment_history = history.getString("column_comment");

                    if (StringUtils.isNullOrEmpty(columnComment_history)){
                        continue;
                    }
                    String type_resource = null;
                    String updateQuery = "";
                    if (map.containsKey(columnName_history)) {
                        type_resource = map.get(columnName_history);
                        System.out.println(dataType_history + "------" + type_resource);
                        //生成修改sql语句
                        updateQuery = "ALTER TABLE stj." + alterTableName + " MODIFY COLUMN " + columnName_history + " " + type_resource + " COMMENT '" + columnComment_history + "'";
                        System.out.println(updateQuery);
                        tatement2.executeUpdate(updateQuery);//打开则执行修改操作
                    }
                }
                System.out.println("字段注释同步完成");
            } catch (SQLException e) {
                e.printStackTrace();
            }
        } finally {

        }
    }
}

思路,通过INFORMATION_SCHEMA数据库中的COLUMNS表查询到要同步的表的信息,通过生成update语句,依次执行达到同步数据表的信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值