为Mysql/Mariadb创建唯一索引的Ecto失败

ard*_*ama 5 mysql elixir mariadb ecto

我尝试执行以下迁移:

defmodule Shopper.Repo.Migrations.MakeNameUniqueShopper do
  use Ecto.Migration

  def change do
    create unique_index :shoppers, [:name]
  end
end
Run Code Online (Sandbox Code Playgroud)

也试过create unique_index :shoppers, [:name], name: :name_unique,create unique_index :shoppers, [:name], name: "name_unique"create index(:shoppers, [:name], unique: true)

但他们失败了类似的错误:

[info]  == Running Shopper.Repo.Migrations.MakeNameUniqueShopper.change/0 forward

[info]  create index shoppers_name_index
** (Mariaex.Error) (1071): Specified key was too long; max key length is 767 bytes
    (ecto) lib/ecto/adapters/sql.ex:172: Ecto.Adapters.SQL.query!/5
    (elixir) lib/enum.ex:1261: Enum."-reduce/3-lists^foldl/2-0-"/3
...
...
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感谢,以帮助我解决错误.

注意:我正在使用ecto 1.02

以下是第一次创建的迁移 mix phoenix.gen.model

defmodule Shopper.Repo.Migrations.CreateV1.Shopper do
  use Ecto.Migration

  def change do
    create table(:shoppers) do
      add :name, :string
      add :oauth_token, :string

      timestamps
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

信息:该name字段是utf8mb4,由我的架构指定

更新:我知道解决方案是减少name字段长度,但如何使它与凤凰模型和迁移一起使用?因为它需要一个字符串?

ard*_*ama 1

感谢 Jos\xc3\xa9 Valim 帮助我完成他的答案,尽管这个答案是我的问题的确切解决方案。

\n\n

使用以下代码创建新的 ecto 迁移脚本:

\n\n
defmodule Shopper.Repo.Migrations.MakeNameUniqueShopper do\n  use Ecto.Migration\n\n  def change do\n    alter table(:shoppers) do\n      modify :name, :string, size: 100\n    end\n\n    create unique_index :shoppers, [:name], name: :shopper_name_unique\n  end\nend\n
Run Code Online (Sandbox Code Playgroud)\n