比较主表与备份表相同字段不同长度的方法

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

public class TableStructureComparator2 {

    private static final String JDBC_URL = "jdbc:mysql://localhost:3306/yourDatabase";
    private static final String USER = "yourUsername";
    private static final String PASSWORD = "yourPassword";

    public static void main(String[] args) {
        try (Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD)) {
            compareTableStructures(conn, "table1", "table2");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void compareTableStructures(Connection conn, String table1, String table2) throws SQLException {
        // 获取第一个表的元数据
        ResultSet rs1 = getTableMetadata(conn, table1);
        // 获取第二个表的元数据
        ResultSet rs2 = getTableMetadata(conn, table2);

        // 存储第一个表的列信息
        ColumnInfo firstTableColumns = new ColumnInfo();
        while (rs1.next()) {
            firstTableColumns.addColumn(rs1);
        }

        // 存储第二个表的列信息
        ColumnInfo secondTableColumns = new ColumnInfo();
        while (rs2.next()) {
            secondTableColumns.addColumn(rs2);
        }

        // 比较第二个表的列信息
        for (ColumnInfo.Column c2 : secondTableColumns.getColumns()) {
            ColumnInfo.Column c1 = firstTableColumns.getColumn(c2.columnName);
            if (c1 == null) {
                System.out.println("Column not found in the first table: " + c2.columnName);
            } else if (c1.dataType != c2.dataType || c1.columnSize != c2.columnSize) {
                System.out.println("Column '" + c2.columnName + "' differs:");
                System.out.println("  - Type: " + c1.dataTypeName + " vs " + c2.dataTypeName);
                System.out.println("  - Size: " + c1.columnSize + " vs " + c2.columnSize);
            }
        }

        // 检查是否有第一张表中存在而第二张表中不存在的列
        for (ColumnInfo.Column c1 : firstTableColumns.getColumns()) {
            if (secondTableColumns.getColumn(c1.columnName) == null) {
                System.out.println("Column not found in the second table: " + c1.columnName);
            }
        }

        rs1.close();
        rs2.close();
    }

    private static ResultSet getTableMetadata(Connection conn, String tableName) throws SQLException {
        DatabaseMetaData metaData = conn.getMetaData();
        ResultSet columns = metaData.getColumns(null, null, tableName, null);
        return columns;
    }

    static class ColumnInfo {
        private List<Column> columns = new ArrayList<>();

        public void addColumn(ResultSet rs) throws SQLException {
            String columnName = rs.getString("COLUMN_NAME");
            int dataType = rs.getInt("DATA_TYPE");
            String dataTypeName = rs.getString("TYPE_NAME");
            int columnSize = rs.getInt("COLUMN_SIZE");
            columns.add(new Column(columnName, dataType, dataTypeName, columnSize));
        }

        public Column getColumn(String columnName) {
            for (Column c : columns) {
                if (c.columnName.equals(columnName)) {
                    return c;
                }
            }
            return null;
        }

        public List<Column> getColumns() {
            return columns;
        }

        public static class Column {
            String columnName;
            int dataType;
            String dataTypeName;
            int columnSize;

            public Column(String columnName, int dataType, String dataTypeName, int columnSize) {
                this.columnName = columnName;
                this.dataType = dataType;
                this.dataTypeName = dataTypeName;
                this.columnSize = columnSize;
            }
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值