【发布时间】:2016-05-10 13:49:19
【问题描述】:
我有这个已经运行并发送到上游的原始迁移:
create table(:videos) do
add :url, :string
add :title, :string
add :description, :text
add :user_id, references(:users, on_delete: :nothing)
timestamps
end
create index(:videos, [:user_id])
现在我希望将user_id 上的外键更改为级联删除,这样当用户被删除时,他的所有相关视频也将被删除。
我尝试了以下迁移:
alter table(:videos) do
modify :user_id, references(:users, on_delete: :delete_all)
end
但这会引发错误:
(Postgrex.Error) ERROR (duplicate_object): constraint "videos_user_id_fkey" for relation "videos" already exists
如何制定一个迁移脚本来根据我的要求更改此外键?
更新
我最终得到了以下解决方案:
def up do
execute "ALTER TABLE videos DROP CONSTRAINT videos_user_id_fkey"
alter table(:videos) do
modify :user_id, references(:users, on_delete: :delete_all)
end
end
def down do
execute "ALTER TABLE videos DROP CONSTRAINT videos_user_id_fkey"
alter table(:videos) do
modify :user_id, references(:users, on_delete: :nothing)
end
end
这会在 ecto 尝试重新创建它之前删除约束。
【问题讨论】:
-
您的问题有有效的答案,最好将其作为单独的答案发布,以便任何人都可以投票。
标签: elixir phoenix-framework ecto