【问题标题】:How to get primary keys for all tables in JDBC?如何获取 JDBC 中所有表的主键?
【发布时间】:2016-11-28 09:36:19
【问题描述】:

我有一个至少包含 500 个表的数据库。获取每个表的所有主键和外键的确切代码是什么?

//Primary Key
DatabaseMetaData meta=conn.getMetaData();
ResultSet rs1= meta.getTables(null, null, "TableName" , new String[]{"TABLE"});
rs1=meta.getPrimaryKeys(null, null, "TableName");
while(rs1.next())
    System.out.println("Primary Key :"+rs1.getString(4));

//Foreign Key
rs1=meta.getExportedKeys(null, null, "TableName");
while(rs1.next())
    System.out.println("Foreign Key :"+rs1.getString(4));

我已使用此代码,它为我提供了准确的键,但对于 500 个表,我必须更改我的代码 500 次。有什么办法可以减少这种工作量?

【问题讨论】:

    标签: java mysql jdbc


    【解决方案1】:

    你不需要修改你的代码500次,你可以使用meta.getTables(null, null, "%", new String[]{"TABLE"})检索所有的表名。

    getTables 方法对tableNamePattern 参数采用类似模式,因此"%" 匹配所有表名。

    getPrimaryKeysgetExportedKeys 方法不采用模式,因此您需要循环getTables 的结果并为getTables 结果集的每一行执行这些方法。

    因此您需要执行以下操作:

    try (ResultSet tables = meta.getTables(null, null, "%", new String[] { "TABLE" })) {
        while (tables.next()) {
            String catalog = tables.getString("TABLE_CAT");
            String schema = tables.getString("TABLE_SCHEM");
            String tableName = tables.getString("TABLE_NAME");
            System.out.println("Table: " + tableName);
            try (ResultSet primaryKeys = meta.getPrimaryKeys(catalog, schema, tableName)) {
                while (primaryKeys.next()) {
                    System.out.println("Primary key: " + primaryKeys.getString("COLUMN_NAME"));
                }
            }
            // similar for exportedKeys
        }
    }
    

    我已经包含了目录和模式的检索,因为这可能会影响事情的工作方式。

    【讨论】:

    • 非常感谢!主键代码正在运行,但对于外键,它显示此错误 - “列名 COLUMN_NAME 无效。”请指导。
    • @KaushalDaga 查看java doc of getExportedKeys 你可能需要使用PKCOLUMN_NAME
    【解决方案2】:

    您可以参考这段代码 sn-p,它向您展示了如何从数据库中获取所有表。

    您需要遍历您的 ResultSet 调用 next()。

    我已经为 MS SQL Server 2012

    尝试过这个
    public class RetrieveAllTables {
        public static void main(String[] args) {
            try {
                Connection connection = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=HubDB", "sa", "password");
                DatabaseMetaData databaseMetaData = connection.getMetaData();
                ResultSet resultSet = databaseMetaData.getTables(null, null, "%", new String[] {"TABLE"});
    
                while(resultSet.next()) {
                    System.out.print("Table Catalog: " + resultSet.getString("TABLE_CAT"));
                    System.out.print("\tTable Schema: " + resultSet.getString("TABLE_SCHEM"));
                    System.out.print("\tTable Name: " + resultSet.getString("TABLE_NAME"));
                    System.out.println();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    

    返回以下内容作为输出:

    Table Catalog: HubDB    Table Schema: dbo   Table Name: films
    Table Catalog: HubDB    Table Schema: dbo   Table Name: FILMS_AUDIT
    Table Catalog: HubDB    Table Schema: sys   Table Name: trace_xe_action_map
    Table Catalog: HubDB    Table Schema: sys   Table Name: trace_xe_event_map
    

    因此您需要更改以下内容

    ResultSet resultSet = databaseMetaData.getTables(null, null, "%", new String[] {"TABLE"});
    

    ResultSet resultSet = databaseMetaData.getTables(null, "dbo", "%", new String[] {"TABLE"});
    

    可以参考getTables()方法文档here

    使用此信息,您可以动态传递个人TableName 以检索Primary KeyForeign Key 详细信息。您现有的代码应该可以很好地通过仅传递一个参数来检索这些详细信息,即上述代码中的TableName

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-17
      • 1970-01-01
      • 1970-01-01
      • 2020-02-17
      • 2011-01-21
      • 1970-01-01
      相关资源
      最近更新 更多