次のようなテーブルの行を削除する必要があります
DELETE FROM TABLE_X WHERE COL_A = 0
しかし、制約違反の可能性がある行を削除したくないので、どの行にこの違反があるのかを知る必要があります...
リレーションテーブルとの結合ができることは知っていますが、削除時にどの行に制約違反があるかを知る一般的な方法があるかどうかを知りたいです。
次のようなテーブルの行を削除する必要があります
DELETE FROM TABLE_X WHERE COL_A = 0
しかし、制約違反の可能性がある行を削除したくないので、どの行にこの違反があるのかを知る必要があります...
リレーションテーブルとの結合ができることは知っていますが、削除時にどの行に制約違反があるかを知る一般的な方法があるかどうかを知りたいです。
JDBCを使用すると仮定すると、GetExportedKeys()という名前のメタデータ関数があります。
これを使用して、最初に外部キー制約を取得します。その情報を使用して、違反をキャッチするための結合ステートメントを作成します。ステートメントを実行して、制約に違反する実際の行を取得します。
このような何かがあなたを助けるかもしれません:
/*テーブルXは子テーブルですテーブルYは親テーブルです*/
DELETE FROM TABLE_X where Y_ID not in(SELECT Y_ID FROM TABLE_Y)
一般的な方法はありません。結合を使用する必要があります(または、汎用であるが組み込みではないメタデータから実行時に結合を生成します)。
システムテーブルをチェックし、制約を解析し、それらを使用してJOINを動的に構築できます。これは簡単なことではありません。
もう1つの方法は、行を1つずつ削除することです(SELECT
すべてのIDを削除してから、主キー値を使用して各行を削除します)。DELETE
失敗する操作は、制約のある行を削除する操作です。
トランザクション内でそれを行い、最後にロールバックして、実際に行を削除しないようにします。
ちなみに、私はこの方法をお勧めしません、それは奇妙で非効率的です。しかし、それは機能します。
xから削除します。ここでcol=0で、primarykeyはありません(PrimaryKey from x Inner Join Y on x.FKey = Y.PrimaryKey)