使用JDBC获取所有外键
我正在使用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获取外键列的名称。 如果有人可以提供帮助,我将非常感激。
即使您的while循环遍历整个ResultSet
,该函数也只会返回FK约束中的最后一列,因为在每次迭代时都会覆盖前一次迭代的值( fkTableData = rs.getString(i);
)。 顺便说一下:`fkTableData实际上应该是方法的局部变量,而不是实例变量。
您的函数应该返回List
而不是String
。
另外:您为ResultSet中的每个列调用一次 getImportedKeys()
。 这是非常低效的。 如果您使用的是Oracle,您会立即注意到,因为检索FK信息的速度非常慢(Postgres在访问系统目录时要快得多)。
由于getImportedKeys()
为每个FK 列返回一行,因此还需要收集属于一个约束定义的所有行(即,对于一个父/子表组合)。
可能最好的方法是定义一个类PkDefinition
,它存储所有涉及的列和所涉及的表名,并使您的函数返回List
以避免对同一结果集行进行多次调用。