【问题标题】:Rails: Adding unique index with migration throws Mysql2::Error: BLOB/TEXTRails:使用迁移添加唯一索引会引发 Mysql2::Error: BLOB/TEXT
【发布时间】:2016-02-03 19:18:11
【问题描述】:

我有这个模型:

ofert.rb

class Ofert < ActiveRecord::Base
belongs_to :user
validates_uniqueness_of :reference, scope: :user_id
end

user.rb

class User < ActiveRecord::Base
    has_many :oferts
end

我要验证user_id范围内的属性reference的唯一性,我的意思是,同一用户不能拥有具有相同引用的产品,但如果不是同一用户,则可以重复引用.

如您所见,Ofert 模型中有一个validates_uniqueness_of 语句,然后我添加了这个迁移:

add_index(:oferts, [:reference, :user_id], unique: true)

但是,当我运行迁移时,出现以下错误:

Mysql2::Error: BLOB/TEXT column 'reference' used in key specification without a key length: CREATE UNIQUE INDEX `index_oferts_on_reference_and_user_id`  ON `oferts` (`reference`, `user_id`)

这里有什么问题?

【问题讨论】:

    标签: mysql ruby-on-rails ruby-on-rails-4 activerecord rails-migrations


    【解决方案1】:

    由于 :reference 是文本或 blob 列,您必须为索引指定长度:

    add_index :oferts, [:reference, :user_id], unique: true, length: 10
    

    最大长度限制取决于您使用的数据库引擎,因此请仔细检查MySQL index documentation

    【讨论】:

    • 如果我只为 :reference 指定长度有什么区别? length: {reference: 6}
    • 不同之处在于,如果您只指定单个长度,则该长度将用于每一列。或者您可以按照您提到的那样单独指定每列的索引长度。
    • 谢谢你的帮助,你真棒!
    猜你喜欢
    • 2018-06-15
    • 2017-11-16
    • 2017-01-06
    • 2018-06-28
    • 2014-09-08
    • 2021-12-17
    • 1970-01-01
    • 2015-03-01
    • 2016-01-06
    相关资源
    最近更新 更多