質問

カスケード削除を使用する参照がなくなったときに、一部のデータが自動的に削除されるようにします。 Stack Overflowに基づく fake データベースで説明します。

Postテーブルがあります。各投稿には0個以上のタグがあります。

したがって、次のようになります。

  

投稿<!> lt;-<!> gt; PostTags <!> lt;-<!> gt;タグ

eg。

  

投稿1には、タグ「A」、「B」、「C」の投稿2があります   タグ「C」、「D」があります。

今、私がしていることは、投稿2のすべてのタグ(たとえばDELETE FROM PostTags WHERE PostId = 2)を削除するとき、タグ 'D'も削除することです。カスケード削除でこれを処理できると思っていましたが、もちろん、Tag->PostTagsまたはPost->PostTagsからカスケードダウンする場合のみです。

これを処理する方法がわかりません。

トリガーを使用することを人々が提案するのではないかと思います:((システムの複雑さ)。

思考?

注:DBはMS Sql2008です。

役に立ちましたか?

解決

残念ながら、ここではカスケードを使用できません。多対多の関係がある場合、子を参照する単一の親が存在しないため、カスケードは機能しません(この場合、Tagsテーブルを参照できるPostTagsエントリが複数あります)。

トリガーはこれを行う方法ですが、お勧めしません。むしろ、データレイヤーで、PostTagsテーブルのエントリを削除した後、参照されなくなったタグを削除することをお勧めします。エントリの削除を行うストアドプロシージャがある場合は、そこでそれを行うことを検討することもできます(比較的簡単に実行できます)。

他のヒント

Postsテーブルでon deleteトリガーを使用する必要があります。このトリガーは、削除される投稿のタグをチェックし、参照されていない場合は削除します(PostTagsテーブルで)。

投稿を削除する前に、このレコードセットを保存してください:

SELECT tagID, count(*) from PostsTags WHERE postId = 2 group by tagID;

その後、削除した後、このレコードセットをループし、count(*)が1の場合、タグを削除します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top