微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我尝试执行以下迁移:

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

  def change do
    create unique_index :shoppers, [:name]
  end
end

还试过创建unique_index:shoppers,[:name],name :: name_unique,create unique_index:shoppingpers,[:name],name:“name_unique”,并创建索引(: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
...
...

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

注意:我正在使用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

信息:名称字段是utf8mb4,由我的架构指定

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

解决方法:

字段“名称”太长.您应该确保它的大小小于767字节,方法是在声明它时传递size选项或只是字段的一部分:

create unique_index :shoppers, ["name(20)"], name: :shoppers_name_unique

请记住,在变更集中调用unique_constraint / 2时,您需要使用相同的名称.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐