How to Delete A Table That Contains a "has many" Value Without Deleting Children
From ElixirBlocks
(Redirected from How to Delete A Table That has many Without Deleting Children)
If you have a table that you are trying to delete and the table contains a has_many relationship, you may get an error similar to the one below when you attempt to delete the parent table.
Error
constraint error when attempting to delete struct:
* item_id_fkey (foreign_key_constraint)
If you would like to stop this constraint violation from raising an
exception and instead add it as an error to your changeset, please
call `foreign_key_constraint/3` on your changeset with the constraint
`:name` as an option.
The changeset has not defined any constraint.
Solution
A possible solution is to edit the schema to use :on_delete to :nilify_all.
on_delete determines how your table reacts to deletion.
Example:
defmodule App.Groups.Group do
use Ecto.Schema
import Ecto.Changeset
alias App.TestBeds.TestBed
schema "groups" do
field :name, :string
has_many :testbeds, TestBed, on_delete: :nilify_all # When Group is deleted, the testbeds are left alone and are not deleted with it
timestamps()
end
@doc false
def changeset(group, attrs) do
group
|> cast(attrs, [:name])
|> validate_required([:name])
end
end
on_delete has other ooptions that may be useful to you. https://hexdocs.pm/ecto/Ecto.Schema.html#has_many/3-options