2016-05-09 11 views
-2

私のアプリケーションからレコードを削除すると、テーブルのいくつかのレコードが保持されます。作成方法を理解するための助けが必要です親テーブルからすでに削除されている子テーブルからレコードを削除するプロシージャ親テーブルにないときに子テーブルからレコードを削除するプロシージャを作成します

+0

もっと多くの情報が必要...テーブル構造はどのように見えますか?いくつかのサンプルデータを提供できますか?あなたはすでに試みたクエリとは何ですか?私たちは魔法のようにあなたがしようとしていることを知らずに答えを与えることはできません。 – Siyual

+6

は、「外部キーの制約」と「カスケードの削除」について聞いたことがありますか? –

+0

あなたはCASCADEをお探しですか? – techspider

答えて

0

一般的にあなたの質問に対する回答は、存在量の数値化として知られています。しかし、あなたはその位置で取得することになっていない

delete from C where not exists (
    select 1 from P 
    where P.child_key = C.key 
) 

:SQLでは、フォームを持っていることは、子供が親を持たない場合であってはなりません。子テーブルには、には親の存在がであると宣言された外部キーが必要です。この方法では、挿入する子の親と親の子であるは、子を参照している間に削除することはできません。

このような外部キー制約が存在する場合、イベントの唯一の許容順序は、最初に子の子を削除してから親のwhere existsのキーを削除することです。正確さのために、2つのステートメントはトランザクションの一部でなければなりません。

一部のコメントでは、宣言参照整合性(DRI)を使用して子行を削除することを推奨しています。私はファンではない。私はDRIを制約の形として使用してルールを作成します。データの処理については、明示的なコードをお勧めします。このコードでは、アプリケーションレベルでの驚きをより簡単に処理できます。

0

ひどく整理されたDBで発生するので、データをクリーンアップする必要があります。

delete childTable where FK_field not in (
select PK_field from parentTable) 

今後この問題を回避するには、childTableのFK制約を作成してください。

関連する問題