sql >> データベース >  >> RDS >> Mysql

多対1の関係でDELETEONCASCADEを使用する方法

    ON DELETE CASCADE 参照している行が削除されたときに行を削除する方法です。これは次のことを意味します:

    • テーブルAに行があります
    • テーブルAの行を参照する行がテーブルBにあります
    • テーブルAの行を削除します
    • データベースはテーブルBの対応する行を削除します

    つまり、アイテムがあり、各アイテムは特定のカテゴリに属しています。アイテムテーブルには、カテゴリテーブルの行を参照するcategory_id(およびスペルを修正してください)があります。したがって、あなたの状況では:

    • カテゴリがあります
    • カテゴリを参照するアイテムがあります
    • カテゴリを削除します
    • データベースは、そのカテゴリに対応するすべてのアイテムを削除します

    あなたが求めているのは、その逆のようなものです:

    • アイテムがあります
    • 特定のカテゴリの最後のアイテムを削除します
    • データベースが移動してそのカテゴリを見つけ、削除します

    ON DELETE CASCADEでこれを行う方法はありません 、2つの理由:

    1. 最初のアイテムを挿入する前に、どのようにして空のカテゴリを作成しますか?データベースはすぐに削除する必要があります。
    2. データベースは、テーブルをスキャンするために多くの追加作業を行う必要があります。アイテム#23082がカテゴリの最後のアイテムであることを「認識」していません。そのためには、カテゴリ内のアイテムの数を何らかの形で追跡する必要があります。

    これはすべて、ON DELETE CASCADEという事実に起因しています。 参照整合性を維持する方法です。 。つまり、データベースは、アイテム#9847にカテゴリ#20393が表示されている場合に、カテゴリ#20393を探しに行くときにそれが存在することを知っているという強力な保証を提供する方法です。 。 ない 省力化装置。 :)これが、他のオプションがON DELETE SET NULLである理由です。 およびON DELETE RESTRICT :整合性も保証しますが、削除する代わりに、不正な参照を削除するか、元の削除が発生しないようにします。

    したがって、答えは、そのテーブルを定期的にクリーンアップするcronジョブを作成するか、空のカテゴリが心配な場合は、ある種のONDELETEトリガーを使用する必要があるということです。




    1. 1つのMySQLクエリで2つのUPDATEステートメントを組み合わせるにはどうすればよいですか?

    2. MySQLの情報スキーマのクエリ:なぜですか?どのように?

    3. Postgres9.1のDockerコンテナがポート5432をホストに公開していません

    4. OracleのRAW(16)から.NETのGUIDに変換する