使用JDBC获取所有外键

时间:2013-09-10 10:36:13

标签: java postgresql jdbc foreign-keys

我正在使用postgreSQL。我试图从表中获取所有外键。这是我目前正在使用的方法。

public String getFKeyData(String tableName, int i) throws SQLException {
    DatabaseMetaData dm = connection.getMetaData();
    ResultSet rs = dm.getImportedKeys(null, null, tableName);
    while (rs.next()) {
        fkTableData = rs.getString(i);
    }
    return fkTableData;
}

这段代码可以工作,但它只能获得最后一个外键,如果表中只有一个,但这不符合我的需要。我在网上看到的所有例子与此非常相似,只提供一个外键作为输出。 目前我只是在按下按钮时打印数据。

System.out.println(databaseConnection.getFKeyData(tableName,3));
System.out.println(databaseConnection.getFKeyData(tableName,4));
System.out.println(databaseConnection.getFKeyData(tableName,8));

3获取从中导入外键的表。 4获取导入的主键列的名称。 8获取外键列的名称。 如果有人可以提供帮助,我将非常感激。

1 个答案:

答案 0 :(得分:8)

即使你的while循环迭代整个ResultSet,该函数也只返回FK约束中的最后一列,因为在每次迭代时都会覆盖前一次迭代的值(fkTableData = rs.getString(i);)。顺便说一下:`fkTableData实际上应该是方法的局部变量,而不是实例变量。

您的函数应返回List<String>而不是String

此外:您在ResultSet中为每个列调用getImportedKeys() 一次。这是非常低效的。如果您使用的是Oracle,您会立即注意到,因为检索FK信息非常缓慢(访问系统目录时Postgres要快得多)。

getImportedKeys()为每个FK 列返回一行时,您还需要收集属于一个约束定义的所有行(即一个父/子表组合)。

可能最好的方法是定义一个类PkDefinition,它存储所有涉及的列和所涉及的表名,并使函数返回List<PkDefinition>以避免对同一结果集行进行多次调用。 / p>