如何获取 JDBC 中所有表的主键?

Posted

技术标签:

【中文标题】如何获取 JDBC 中所有表的主键?【英文标题】:How to get primary keys for all tables in 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 次。有什么办法可以减少这种工作量?

【问题讨论】:

【参考方案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

【讨论】:

以上是关于如何获取 JDBC 中所有表的主键?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中获取 Ms Access 表的主键

如何在 MySQL 中获取特定表的主键“列名”

如何使用sqlalchemy获取表的主键以及每一个字段名

如何从 JAVA 中的 ResultSet 或 ResultSetMetaData 对象中获取数据库表的主键的列名?

如何在 C# 中获取 DataGridView 中的主键?

如何获取mysql数据库中某个表的主键或唯一字段