sql >> Database teknologi >  >> RDS >> PostgreSQL

PG::ForeignKeyViolation:FEJL:opdatering eller sletning på tabel xxx overtræder fremmednøglebegrænsning

Fra den fine manual :

:delete_all tager sig af fremmednøgler, men da der ikke kaldes tilbagekald, går det kun et niveau dybt. Så dette i Company :

has_many :projects, dependent: :delete_all

betyder, at kalde #destroy på en virksomhed vil direkte slette de tilknyttede projects fra databasen. Men det vil ikke se dette:

has_many :tasks, dependent: :delete_all

som du har i Project og du ender med at prøve at slette projekter, der stadig er refereret til i tasks som fejlmeddelelsen indikerer.

Du kan skifte alle dine tilknytninger til dependent: :destroy , dette vil trække alt ud af databasen, før de ødelægger dem, og tilbagekald vil blive kaldt (hvilket vil indlæse flere ting ud af databasen kun for at ødelægge dem, hvilket vil indlæse flere ting ud af databasen...). Slutresultatet vil være en masse databaseaktivitet, men alle fremmednøglerne vil blive fulgt korrekt.

Alternativt kan du placere logikken i databasen, hvor den normalt hører hjemme ved at angive on delete cascade på fremmednøglebegrænsningerne :

Din add_foreign_key opkald ville se sådan ud:

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

I dette tilfælde. Du vil sandsynligvis forlade dependent: :delete_all er i dine modeller som en påmindelse om, hvad der sker, eller du kan efterlade dig selv en kommentar.



  1. Opret forbindelse til en mysql-database via SSH gennem PHP

  2. Unionsforespørgsel med flere valg efter java 8

  3. Gem procedure returnerer ikke værdi i MVC5

  4. Returnerer string array og brug det på AutoCompleteTextview