zerstören Ich habe eine einfache has_many
Beziehung in einer Rails-4.2-Modell:Schienen Foreign Key Verletzung Löschen has_many Beziehungen mit abhängigen
class Owner < ActiveRecord::Base
has_many :nested_things, :inverse_of => :owner, :class_name => "Nested::Thing", :dependent => :destroy
end
class Nested::Thing < ActiveRecord::Base
belongs_to :owner, :inverse_of=>:nested_things
end
Die Modelle wesentlich komplizierter als diese sind, mit vielen anderen Beziehungen.
Wenn jemand versucht, eine Owner
heute zu löschen, es scheiterte, weil es ein Fremdschlüssel auf der nested_things
Tabelle ist:
> psql annoying_problem
psql (9.5.3)
Type "help" for help.
annoying_problem=# \d+ nested_things
Table "public.nested_things"
Column | Type | Modifiers | Storage | Stats target | Description
------------------+-----------------------------+----------------------------------------------------------------+----------+--------------+-------------
id | integer | not null default nextval('nested_things_id_seq'::regclass) | plain | |
owner_id | integer | | plain | |
Indexes:
"nested_things_pkey" PRIMARY KEY, btree (id)
"ix_nested_things_on_owner_id" btree (owner_id)
Foreign-key constraints:
"nested_things_owner_id_fk" FOREIGN KEY (owner_id) REFERENCES owners(id)
Wenn die owner
gelöscht, es ist ein zeitaufwendiger Prozess - lokal diese bestimmten Datensatz generierte eine 109.000 Zeilen Logdatei aller ausgeführten SQL. die Nested_things-Beziehung führt jedoch dazu, dass der gesamte Vorgang abgebrochen wird, da eine Überprüfung des Fremdschlüssels fehlschlägt.
Hier ist, was der relevante Teil der Protokolldatei zu sein scheint:
> grep -n nested_things delete-owner.txt
....
109762: SQL (1.1ms) DELETE FROM "nested_things" WHERE "nested_things"."id" = $1 [["id", 8665]]
109836: ActiveRecord::InvalidForeignKey: PG::ForeignKeyViolation:
ERROR: update or delete on table "owners" violates foreign key
constraint "nested_things_owner_id_fk" on table "nested_things"
109837: DETAIL: Key (id)=(6343) is still referenced from table "nested_things".
Es gibt nur eine nested_things Eintrag für diesen Besitzer. Was kann eine: dependent =>: zerstören Beziehung in Rails, um die abhängige Beziehung zu löschen, aber die Fremdschlüsselprüfung fehlschlagen?
Ich dachte, vielleicht der Index war beschädigt, aber wieder Indizierung nichts ändern. –
Dies ist nicht der erste Fremdschlüssel, der überprüft wird, wenn ich versuche, direkt aus der Tabelle zu löschen. –
Löschen eines anderen Besitzer Datensatz, der auch geschachtelte_things funktioniert gut. –