添加一个唯一字段并填写它

Add a unique field and fill it

我正在使用 Elixir 和 Phoenix,我有一个 table,我想向这个 table 添加一个新字段,但我希望这个字段是唯一的。由于我的数据库在 table 中已经有一堆寄存器,所以我想用 table 的另一个字段的值填充新字段。

例如,table 它的帖子,我正在添加新的字段名称,这将是唯一的,并希望所有旧寄存器用字段电子邮件中的值填充字段名称。

我该怎么做?我在迁移中这样做吗?喜欢:

def change do
  alter table(:posts) do
    add :name, :string, null: false, default: :email
  end

  create unique_index(:posts, [:name])
end

或在模型中?

请帮帮她,非常感谢。

您需要使用 Ecto 的 update_all 来执行此操作:

alias Myapp.Repo
alias Myapp.Post
import Ecto.Query

from(p in Post, update: [set: [name: p.old_name]])
|> Repo.update_all([])

作为old_name你的旧字段并命名你想要旧值的字段。

请参阅 Ecto.Query 文档 https://hexdocs.pm/ecto/Ecto.Repo.html#c:update_all/3