0

次のようなテーブルの行を削除する必要があります

DELETE FROM TABLE_X WHERE COL_A = 0

しかし、制約違反の可能性がある行を削除したくないので、どの行にこの違反があるのか​​を知る必要があります...

リレーションテーブルとの結合ができることは知っていますが、削除時にどの行に制約違反があるかを知る一般的な方法があるかどうかを知りたいです。

4

5 に答える 5

1

JDBCを使用すると仮定すると、GetExportedKeys()という名前のメタデータ関数があります。

http://docs.oracle.com/javase/7/docs/api/java/sql/DatabaseMetaData.html#getExportedKeys%28java.lang.String,%20java.lang.String,%20java.lang.String%29

これを使用して、最初に外部キー制約を取得します。その情報を使用して、違反をキャッチするための結合ステートメントを作成します。ステートメントを実行して、制約に違反する実際の行を取得します。

于 2012-07-05T20:18:16.117 に答える
1

このような何かがあなたを助けるかもしれません:

/*テーブルXは子テーブルですテーブルYは親テーブルです*/

DELETE FROM TABLE_X where Y_ID not in(SELECT Y_ID FROM TABLE_Y)

于 2012-07-05T20:33:40.603 に答える
0

一般的な方法はありません。結合を使用する必要があります(または、汎用であるが組み込みではないメタデータから実行時に結合を生成します)。

于 2012-07-05T20:14:00.707 に答える
0

システムテーブルをチェックし、制約を解析し、それらを使用してJOINを動的に構築できます。これは簡単なことではありません。

もう1つの方法は、行を1つずつ削除することです(SELECTすべてのIDを削除してから、主キー値を使用して各行を削除します)。DELETE失敗する操作は、制約のある行を削除する操作です。

トランザクション内でそれを行い、最後にロールバックして、実際に行を削除しないようにします。

ちなみに、私はこの方法をお勧めしません、それは奇妙で非効率的です。しかし、それは機能します。

于 2012-07-05T20:16:02.517 に答える
0

xから削除します。ここでcol=0で、primarykeyはありません(PrimaryKey from x Inner Join Y on x.FKey = Y.PrimaryKey)

于 2012-07-05T20:17:00.523 に答える