在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语句,依次执行达到同步数据表的信息。