1

BD At Work の使用時に問題が発生することがあります。通常、セッションを閉じた状態でJavaでテーブルを回復または更新しようとするときです(有名な LazyInitializatioException )。最後に、存在しない主キー インデックスの値を指す外部キーが存在することが問題になる場合があります。これが発生すると、怠惰なエンティティは正しく読み込まれません。

では、テーブル データに外部キー インデックスが存在しない主キーに設定されているかどうかを確認する方法はありますか?

単一の列の場合は簡単です。しかし、約 10 個または 20 個の外部キーを持つテーブルを意味します。

私はpostgresを使用しています。それが特にそれに対する答えである場合、それははるかに良いでしょう。=]

私の悪い英語でごめんなさい(ネイティブではありません)。

4

2 に答える 2

5

私は通常、次のようなクエリを使用します

SELECT * FROM my_table WHERE fk_field NOT IN (SELECT id FROM related_table);

通常は正常に動作します。このタスクにもっと適切なものがあるかどうかはわかりません (ORM および/または常に使用する場合、この種の問題はあまり発生しませんDELETE .. CASCADE)。

アップデート

もちろん、これを使用して、一度に多くの fk フィールドを直接クエリできます。

SELECT * FROM my_table WHERE fk_field NOT IN (SELECT id FROM related_table)
    OR fk_field2 NOT IN (SELECT id FROM related_table2)
    OR fk_field3 NOT IN (SELECT id FROM related_table3);

..等..

于 2012-11-09T20:12:50.417 に答える
1

私はJavaとあなたが言及したそれらのエラーに精通していません。
最善の解決策は、別のテーブルから参照されている場合にレコードを削除できない外部キー制約をdbに作成することです。

試してみる必要がある場合:

select some_columns
from table1 t1 left join table2 t2 on (t1.id1 = t2.table1_id1)
where t2.id is null
limit 1

そのようなレコードが存在するかどうかを確認します。
これらのテーブルが大きい場合、迅速な解決策はありません(通常は全表スキャンで終了します)。

外部キー制約を使用して、カスケード削除を実行したり、nullを自動的に設定したりすることもできます。postgresqlドキュメントのFOREIGNKEYの部分を読んでください

于 2012-11-09T20:30:15.100 に答える