複数のカスケード パスを使用する典型的な状況は次のとおりです。2 つの詳細 ("Master"、"Detail1"、"Detail2" など) を持つマスター テーブル。どちらの詳細もカスケード削除です。これまでのところ問題はありません。しかし、両方の詳細が他のテーブル ("SomeOtherTable" など) と 1 対多の関係にある場合はどうなるでしょうか。SomeOtherTable には Detail1ID 列と Detail2ID 列があります。
Master { ID, masterfields }
Detail1 { ID, MasterID, detail1fields }
Detail2 { ID, MasterID, detail2fields }
SomeOtherTable {ID, Detail1ID, Detail2ID, someothertablefields }
つまり、SomeOtherTable の一部のレコードは Detail1 レコードにリンクされ、SomeOtherTable の一部のレコードは Detail2 レコードにリンクされています。SomeOtherTable-records が両方の Details に決して属さないことが保証されている場合でも、Master から SomeOtherTable への複数のカスケード パス (Detail1 経由と Detail2 経由) があるため、SomeOhterTable のレコードを両方の詳細に対してカスケード削除することは現在不可能です。今、あなたはすでにこれを理解しているかもしれません。考えられる解決策は次のとおりです。
Master { ID, masterfields }
DetailMain { ID, MasterID }
Detail1 { DetailMainID, detail1fields }
Detail2 { DetailMainID, detail2fields }
SomeOtherTable {ID, DetailMainID, someothertablefields }
すべての ID フィールドはキー フィールドであり、自動インクリメントです。核心は、詳細テーブルの DetailMainId フィールドにあります。これらのフィールドは、キー制約と参照制約の両方です。マスターレコードのみを削除することで、すべてをカスケード削除できるようになりました。欠点は、detail1 レコードごとに、detail2 レコードごとに、DetailMain レコードも存在する必要があることです (実際には、正しい一意の ID を取得するために最初に作成されます)。