3

私は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;
}

このコードは機能しますが、最後の外部キーしか取得できません。これは、テーブルに 1 つしかない場合でも問題ありませんが、これは私のニーズには合いません。私がオンラインで見たすべての例はこれに非常に似ており、出力として 1 つの外部キーのみを提供します。現在、ボタンが押されたときにデータを印刷しています。

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

3 外部キーのインポート元のテーブルを取得します。4 インポートされた主キー列の名前を取得します。8 外部キー列の名前を取得します。誰かが助けてくれれば、とても感謝しています。

4

1 に答える 1

8

while ループが全体を反復しても、ResultSet各反復で前の反復 ( fkTableData = rs.getString(i);) の値を上書きするため、関数は FK 制約の最後の列のみを返します。ところで: `fkTableData は、実際にはインスタンス変数ではなく、メソッドのローカル変数である必要があります。

関数は a List<String>not aを返す必要がありStringます。

さらに、ResultSet のgetImportedKeys() 列ごとに 1 回呼び出しています。それは非常に非効率的です。Oracle を使用していた場合は、FK 情報の取得が非常に遅いため、すぐに気付くでしょう (システム カタログにアクセスする場合、Postgres の方がはるかに高速です)。

FK列getImportedKeys()ごとに 1 つの行を返すので、1 つの制約定義 (つまり、1 つの親/子テーブルの組み合わせ) に属するすべての行を収集する必要もあります。

おそらく最善の方法は、PkDefinition関連するすべての列と関連するテーブル名を格納するクラスを定義List<PkDefinition>し、同じ結果セット行に対する複数の呼び出しを避けるために関数を返すことです。

于 2013-09-10T11:23:37.370 に答える