2012-03-06 17 views
1

私は2種類のドキュメントを持っています。 1つはフォルダ単位で整理されています。もう1つはクライアントによって編成されています。1対1テーブルの対応する行が削除されたときに、テーブル内の行を自動的に削除する方法はありますか?

Table docs 
ID 
title 

Table folderDocs 
docID -> docs(ID) 
folderID -> folders(ID) ON DELETE CASCADE 

Table clientDocs 
docID -> docs(ID) 
clientID -> clients(ID) ON DELETE CASCADE 

私は、フォルダまたはクライアントが削除されたときに自動的にドキュメントを削除するエレガントな方法を探しています:ここではMySQLでのテーブル構造、です。上記のカスケード規則はこれを達成しません。 (つまり、folderDocsの行は削除されますが、ドキュメントの対応する行は残っています)。

これを設定するには、カスケードルールやその他の方法を使用してmysqlで設定する必要があります。 clientDocsはカスケードによって削除され、docsの対応する行も削除されますか? (私はプログラムで最初に文書を削除してから、フォルダ/クライアントを削除する必要がないようにしたいと考えています)

ありがとうございました。

+0

下のクエリを使用して、フォルダとクライアントを持たないすべての文書はこれがばかな質問かもしれませんが、あなたは、 'docID'があなたのテーブルの外部キーとして設定されていますか?あなたが望んでいるのは正確に 'ON DELETE CASCADE'と同じように聞こえるからですが、外部キーがセットされていなければ動作しません。 –

+0

なぜDELETEトリガーを使用しないのですか? – Roger

+0

@Rogier - 削除がカスケードである場合、DELETEトリガーは機能しません。私はこれについて間違っている場合は私を修正してください。 – user1031947

答えて

0

が必要です

DELETE FROM docs USING docs 
LEFT JOIN clientDocs c ON (c.docid = docs.id) 
LEFT JOIN folderDocs f ON (f.docid = docs.id) 
WHERE ISNULL(c.clientid) AND ISNULL(f.folderid) 
+0

これは動作します。しかし、今問題は、あなたがドキュメントを照会するたびに、それらが依然として有効かどうかを見るためにフォルダとクライアントを照会する必要があることです。 – iWantSimpleLife

+0

このコードをclientDocsおよびfolderDocsテーブルのafterDeleteトリガに追加して、ドキュメントが削除されるたびに実行されるようにするか、cronジョブから5分ごとにクエリを実行することができます –

0

私はあなたがまっすぐなSQLでそれを行うことはできないと思います。それを行うストアドプロシージャを記述する必要があります。

しかし、それは良い考えです。テーブルが設計されているように、多面的な関係のように見えます。他のフォルダからの参照がまだ残っている場合は、その文書を削除できますか?

1対多の関係であると考えられる場合、フォルダーとクライアントへの外部キーは、単独の表ではなく、docでなければなりません。カスケード削除を使用することができます。

編集:代わりにトリガーを試すことができます。 http://dev.mysql.com/doc/refman/5.0/en/triggers.html

が、それはまだ、各文書は、あなたが削除する予定のクリーンアップジョブ設定したいことがあり、フォルダまたはクライアントに属している必要がありますと仮定すると(トリガーの形で)いくつかのコードが書かれていること

+0

docs&folderDocsとdocs&clientDocsの関係は1:1です。 – user1031947

+0

答えを編集しました。 – iWantSimpleLife

関連する問題