PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

PG ::ForeignKeyViolation:LỖI:cập nhật hoặc xóa trên bảng xxx vi phạm ràng buộc khóa ngoại

Từ hướng dẫn tốt :

Vì vậy, :delete_all thực hiện chăm sóc các khóa ngoại nhưng, vì không có lệnh gọi lại nào được gọi, nó chỉ đi sâu một cấp. Vì vậy, điều này trong Company :

has_many :projects, dependent: :delete_all

nghĩa là gọi #destroy trên một công ty sẽ trực tiếp xóa các projects được liên kết từ cơ sở dữ liệu. Nhưng điều đó sẽ không nhìn thấy điều này:

has_many :tasks, dependent: :delete_all

mà bạn có trong Project và cuối cùng bạn cố gắng xóa các dự án vẫn được tham chiếu trong tasks như thông báo lỗi chỉ ra.

Bạn có thể chuyển tất cả các liên kết của mình thành dependent: :destroy , điều này sẽ kéo mọi thứ ra khỏi cơ sở dữ liệu trước khi phá hủy chúng và các lệnh gọi lại sẽ được gọi (sẽ tải nhiều thứ hơn ra khỏi cơ sở dữ liệu chỉ để phá hủy chúng sẽ tải nhiều thứ hơn ra khỏi cơ sở dữ liệu ...). Kết quả cuối cùng sẽ là rất nhiều hoạt động của cơ sở dữ liệu nhưng tất cả các khóa ngoại sẽ được tuân theo đúng cách.

Ngoài ra, bạn có thể đặt logic bên trong cơ sở dữ liệu nơi nó thường thuộc về bằng cách chỉ định on delete cascade về các ràng buộc khóa ngoài :

add_foreign_key của bạn cuộc gọi sẽ giống như sau:

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

trong trường hợp này. Bạn có thể muốn để dependent: :delete_all s trong các mô hình của bạn như một lời nhắc nhở về những gì đang xảy ra hoặc bạn có thể để lại cho mình một nhận xét.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ứng dụng Spring Boot không thể truy cập PostgreSQL bằng thông tin đăng nhập từ Kubernetes secret

  2. Lưu trữ truy vấn chung dưới dạng cột?

  3. Không thể cài đặt plpython3u - postgresql

  4. Sử dụng npgsql 12 và ef 6 cùng nhau - có ai thành công với nó không?

  5. Tại sao tôi không thể sử dụng một biến trong lệnh gạch chéo ngược postgres (\ COPY)