gpt4 book ai didi

elixir - 在 Ecto 中修改外键

转载 作者:行者123 更新时间:2023-12-03 09:04:33 25 4
gpt4 key购买 nike

我有这个已经运行并发送到上游的原始迁移:

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 尝试重新创建它之前删除约束。

最佳答案

Ecto SQL 3.4.3 :

“如果 :from 值为 %Reference{} ,适配器将在修改类型之前尝试删除相应的外键约束。”

modify :user_id, references(:users, on_delete: :delete_all), from: references(:users)

应该管用。在进行回滚时,我发现这可以清除 FK 并删除列:
remove :user_id, references(:users)

关于elixir - 在 Ecto 中修改外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35141912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com