18

私はこのように見える3つのテーブルを持っています:( 出典:InsomniacGeek.com

外部キーにカスケード削除を設定しました。現在、Folderテーブルのレコードを削除すると、FolderItemの関連レコードのみが削除されます。

これは予想され、正しいことです。

私が達成したいのは、Folderテーブルのレコードを削除するときに、FolderItemとItemテーブルの対応するレコードを削除する必要があるということです。

どうすればこれを解決できますか?問題のFolderIDを持つItemのすべてのインスタンスを削除するトリガーを追加することによって?または、より良い解決策はありますか?

4

3 に答える 3

14

システムで正確にどのような動作を行うかを決定する必要があります。あなたの要件は少し異常に聞こえ、db スキーマ設計の間違いを示している可能性があります。関連するフォルダが削除されたときにアイテムを削除したいのはなぜですか? 多対多の関係であるため、そのアイテムにまだ関連付けられている別のフォルダーがある場合はどうなりますか? その場合、Item を削除すると、実際には Item と FolderItem の間で外部キー違反が発生します。アイテムが実際に特定のフォルダーに属している場合 (つまり、1 対多の関係)、FolderItem テーブルはまったく必要ありません。

最も可能性の高いケースは、それに関連する他の FolderItem エントリがない場合に Item を削除することだと思います。その場合、トリガーは適切なソリューションですが、トリガー ロジックで確認する必要があります。

于 2009-09-04T13:55:43.383 に答える
2

フォルダー アイテムとアイテムの間の FK では、カスケード削除もオンにする必要があります。

更新:
あなたのコメントと別の答えを読みました。その通りです。あなたの質問を正しく読むことができませんでした。単純な 1 対多の関係を想定するのは正しいのですが、多対多の場合はそれほど単純ではありません。トリガー (さらに良いのは、コード内のビジネス ロジック) は、目的を達成するための最善の策です。

于 2009-09-04T13:41:52.573 に答える
-1

m 対 m の関係がある場合、フォルダ項目も別のコースに関連付けることができると想定されるため、folteritem レコードを削除することはできません。そのため、フォルダー レコードを削除する場合、関連するフォルダー項目ではなく、関係のみを削除する必要があります。すべてのフォルダー項目を 1 つのフォルダーのみに関連付けることができる場合は、1 対多の関係を使用して、フォルダー項目 fk (fk -> フォルダー内の pk) にカスケードを設定する必要があります。

于 2017-08-20T03:11:33.740 に答える