sql >> Databasteknik >  >> RDS >> PostgreSQL

PG::ForeignKeyViolation:FEL:uppdatera eller ta bort på tabell xxx bryter mot begränsningen för främmande nyckel

Från den fina manualen :

:delete_all tar hand om främmande nycklar men eftersom inga återuppringningar anropas går det bara en nivå djupt. Så detta i Company :

has_many :projects, dependent: :delete_all

betyder att anropet #destroy på ett företag kommer direkt att radera de associerade projects från databasen. Men det kommer inte att se detta:

has_many :tasks, dependent: :delete_all

som du har i Project och det slutar med att du försöker ta bort projekt som fortfarande hänvisas till i tasks som felmeddelandet indikerar.

Du kan byta alla dina associationer till dependent: :destroy , kommer detta att dra ut allt ur databasen innan de förstörs och callbacks kommer att anropas (vilket kommer att ladda fler saker ur databasen bara för att förstöra dem vilket kommer att ladda fler saker ur databasen...). Slutresultatet kommer att bli mycket databasaktivitet men alla främmande nycklar kommer att följas ordentligt.

Alternativt kan du placera logiken i databasen där den vanligtvis hör hemma genom att ange on delete cascade på de främmande nyckelbegränsningarna :

Din add_foreign_key samtal skulle se ut så här:

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 detta fall. Du skulle förmodligen vilja lämna dependent: :delete_all finns i dina modeller som en påminnelse om vad som händer, eller så kan du lämna en kommentar till dig själv.



  1. MySQL användarrättigheter på delade servrar

  2. Interner i de sju SQL-serversorterna – Del 2

  3. MySQL Connector för C++ | MySQL_Connection::setReadOnly() undantag på setSchema

  4. Det gick inte att ladda den begärda klassen:com.mysql.jdbc.Driver på JBoss med hjälp av HIbernate