PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

PG::ForeignKeyViolation:ERROR:perbarui atau hapus pada tabel xxx melanggar batasan kunci asing

Dari manual bagus :

Jadi :delete_all memang menangani kunci asing tetapi, karena tidak ada panggilan balik yang dipanggil, itu hanya masuk satu tingkat. Jadi ini di Company :

has_many :projects, dependent: :delete_all

artinya memanggil #destroy pada perusahaan akan langsung menghapus projects yang terkait dari basis data. Tapi itu tidak akan melihat ini:

has_many :tasks, dependent: :delete_all

yang Anda miliki di Project dan Anda akhirnya mencoba menghapus proyek yang masih direferensikan di tasks seperti yang ditunjukkan oleh pesan kesalahan.

Anda dapat mengalihkan semua asosiasi Anda ke dependent: :destroy , ini akan menarik semuanya keluar dari database sebelum menghancurkannya dan panggilan balik akan dipanggil (yang akan memuat lebih banyak hal dari database hanya untuk menghancurkannya yang akan memuat lebih banyak hal dari database...). Hasil akhirnya akan banyak aktivitas database tetapi semua kunci asing akan diikuti dengan benar.

Atau, Anda dapat meletakkan logika di dalam basis data yang biasanya berada dengan menentukan on delete cascade pada batasan kunci asing :

add_foreign_key . Anda panggilan akan terlihat seperti:

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

pada kasus ini. Anda mungkin ingin meninggalkan dependent: :delete_all s di model Anda sebagai pengingat tentang apa yang terjadi, atau Anda dapat meninggalkan komentar untuk diri sendiri.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. tidak dapat membuat ekstensi tanpa peran pengguna super

  2. Postgres hierarkis (jsonb) CTE terlalu lambat

  3. Pengecualian C# SqlConnection:Kata Kunci tidak Didukung 'Port'

  4. JodaTime dengan nilai JPA, PostgreSQL, dan NULL

  5. Bagaimana cara menonaktifkan integritas referensial di Postgres 8.2?