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

PG ::ForeignKeyViolation:エラー:テーブルxxxの更新または削除が外部キー制約に違反しています

    FineManual から :

    したがって、:delete_all 外部キーを処理しますが、コールバックが呼び出されないため、1レベルの深さしかありません。つまり、これはCompany

    has_many :projects, dependent: :delete_all
    

    #destroyを呼び出すことを意味します 会社では、関連するprojectsを直接削除します データベースから。しかし、これはわかりません:

    has_many :tasks, dependent: :delete_all
    

    Projectにあるもの そして、tasksでまだ参照されているプロジェクトを削除しようとすることになります。 エラーメッセージが示すように。

    すべての関連付けをdependent: :destroyに切り替えることができます 、これはそれらを破壊する前にデータベースからすべてを引き出し、コールバックが呼び出されます(データベースからより多くのものをロードするためにそれらを破壊するためだけにデータベースからより多くのものをロードします...)。最終的には多くのデータベースアクティビティが発生しますが、すべての外部キーは適切に追跡されます。

    または、on delete cascade 外部キー制約について

    add_foreign_key 通話は次のようになります:

    add_foreign_key "projects", "companies", on_delete: :cascade
    add_foreign_key "tasks", "projects", on_delete: :cascade
    add_foreign_key "task_times", "tasks", on_delete: :cascade
    

    この場合。おそらくdependent: :delete_allのままにしておきたいでしょう 何が起こっているかを思い出させるためにモデルに入れてください。または、コメントを残すこともできます。



    1. pipフリーズはhelp('modules')とは異なるモジュールを提供します

    2. PostgreSQLの部分的な一意のインデックスとアップサート

    3. Jenkinsを使用したPostgreSQLの毎日のタスクの自動化

    4. テーブルでのPHPPDOクエリエラーのデータ型はjson(MySQL 5.7.8-rc)