sql >> Database >  >> RDS >> PostgreSQL

PG::ForeignKeyViolation:FOUT:bijwerken of verwijderen op tabel xxx schendt de beperking van de refererende sleutel

Uit de fijne handleiding :

Dus :delete_all zorgt wel voor buitenlandse sleutels, maar aangezien er geen callbacks worden aangeroepen, gaat het maar één niveau diep. Dus dit in Company :

has_many :projects, dependent: :delete_all

betekent dat het aanroepen van #destroy op een bedrijf verwijdert direct de bijbehorende projects uit de databank. Maar dat ziet dit niet:

has_many :tasks, dependent: :delete_all

die je hebt in Project en uiteindelijk probeer je projecten te verwijderen waarnaar nog steeds wordt verwezen in tasks zoals de foutmelding aangeeft.

Je zou al je associaties kunnen veranderen in dependent: :destroy , dit zal alles uit de database halen voordat ze worden vernietigd en callbacks worden aangeroepen (waardoor meer dingen uit de database worden geladen om ze te vernietigen, waardoor meer dingen uit de database worden geladen...). Het eindresultaat zal veel database-activiteit zijn, maar alle externe sleutels zullen correct worden gevolgd.

Als alternatief kunt u de logica in de database plaatsen waar deze gewoonlijk thuishoort door on delete cascade over de externe sleutelbeperkingen :

Uw add_foreign_key oproepen zouden er als volgt uitzien:

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

in dit geval. Je zou waarschijnlijk de dependent: :delete_all . willen laten staan s in uw modellen als herinnering aan wat er aan de hand is, of u kunt een opmerking voor uzelf achterlaten.



  1. Meerdere SET-velden met LOAD DATA INFILE voor datumnotatie

  2. Converteer 'datetimeoffset' naar 'time' in SQL Server (T-SQL-voorbeelden)

  3. Voeg meerdere rijen samen in één kolom met behulp van een functie in Oracle met 3 gerelateerde tabellen

  4. MySQL Deelnemen aan dezelfde tabel