sql >> Databáze >  >> RDS >> PostgreSQL

PG::ForeignKeyViolation:ERROR:aktualizace nebo odstranění v tabulce xxx porušuje omezení cizího klíče

Z dobré příručky :

Takže :delete_all se stará o cizí klíče, ale protože nejsou vyvolána žádná zpětná volání, jde pouze o jednu úroveň hluboko. Takže toto v Company :

has_many :projects, dependent: :delete_all

znamená, že volání #destroy na společnosti přímo odstraní související projects z databáze. To ale neuvidí toto:

has_many :tasks, dependent: :delete_all

které máte v Project a nakonec se pokusíte odstranit projekty, na které se stále odkazuje v tasks jak ukazuje chybová zpráva.

Můžete přepnout všechna svá přidružení na dependent: :destroy , tím se vše vytáhne z databáze před jejich zničením a budou volána zpětná volání (která načtou více věcí z databáze, jen aby je zničila, čímž se načtou další věci z databáze...). Konečným výsledkem bude velká databázová aktivita, ale všechny cizí klíče budou správně dodrženy.

Alternativně můžete logiku umístit do databáze, kam obvykle patří, zadáním on delete cascade na omezení cizího klíče :

Váš add_foreign_key hovory by vypadaly takto:

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

v tomto případě. Pravděpodobně budete chtít ponechat dependent: :delete_all s ve vašich modelech jako připomínka toho, co se děje, nebo můžete zanechat komentář.



  1. MySQL Select JOIN 3 Tables

  2. Používání MySQL s Androidem

  3. Nekompatibilita s Mysql 5.7 (výraz #1 klauzule ORDER BY není v seznamu SELECT)

  4. Schéma DB pro RBAC s více úrovněmi rolí