複数のカスケードパスを持つ典型的な状況は次のようになります。2つの詳細を持つマスターテーブル、たとえば「マスター」と「詳細1」と「詳細2」としましょう。両方の詳細はカスケード削除です。これまでのところ問題はありません。しかし、両方の詳細に他のテーブル(「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レコードが両方の詳細に属さないことが保証されている場合でも、マスターからSomeOtherTable(Detail1を介して1つとDetail2を介して1つ)へのカスケードパスが複数あるため、SomeOhterTableのレコードを両方の詳細に対してカスケード削除することは不可能になりました。今、あなたはすでにこれを理解しているかもしれません。これが可能な解決策です:
Master { ID, masterfields }
DetailMain { ID, MasterID }
Detail1 { DetailMainID, detail1fields }
Detail2 { DetailMainID, detail2fields }
SomeOtherTable {ID, DetailMainID, someothertablefields }
すべてのIDフィールドはキーフィールドと自動インクリメントです。重要な部分は、詳細テーブルのDetailMainIdフィールドにあります。これらのフィールドは、キーと参照制約の両方です。マスターレコードを削除するだけで、すべてをカスケード削除できるようになりました。欠点は、detail1レコードごと、およびdetail2レコードごとに、DetailMainレコード(実際には、正しい一意のIDを取得するために最初に作成される)も必要であるということです。