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

时间:2016-11-28 09:36:19

标签: java mysql jdbc

我有一个至少有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次。有没有办法尽量减少这种努力?

2 个答案:

答案 0 :(得分:3)

您可以参考此代码段,其中显示了如何从数据库中获取所有表。

您需要遍历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,您现有的代码就可以正常检索这些细节。

答案 1 :(得分:2)

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

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

方法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
    }
}

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