【问题标题】:Rails BLOB/TEXT column used in key specification without a key lengthRails BLOB/TEXT 列在没有密钥长度的密钥规范中使用
【发布时间】:2012-04-10 15:58:20
【问题描述】:

我正在尝试运行 rails 迁移,我看到错误“BLOB/TEXT column used in key specification without a key length”...但是,我在迁移类中指定了长度。从迁移生成 SQL 语句时,Rails 似乎忽略了这一点。有什么线索吗?

这是我的迁移课程:

class AddIndexToAccounts < ActiveRecord::Migration
def self.up
  add_index :TACCOUNT, :NAMEX, :length => 5
end
def self.down
  remove_index :TACCOUNT, :NAMEX
end
end

这是错误输出。它似乎已经看到了长度规范,但它没有出现在它生成的 SQL 语句中:

** [out :: 192.168.10.7] -- add_index(:TACCOUNT, :NAMEX, {:length=>5})
** [out :: 192.168.10.7] rake aborted!
** [out :: 192.168.10.7] An error has occurred, all later migrations canceled:
** [out :: 192.168.10.7] 
** [out :: 192.168.10.7] Mysql::Error: BLOB/TEXT column 'NAMEX' used in key specification without a key length: CREATE  INDEX `index_TACCOUNT_on_NAMEX` ON `TACCOUNT` (`NAMEX`)

【问题讨论】:

  • 索引TEXT 列通常是个坏主意。如果您需要为该类型的列编制索引,为什么首先要对它进行索引?
  • 我同意你的观点,这就是为什么我只尝试索引前几个字符。我只是在使用给定的数据库结构

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


【解决方案1】:

您可以尝试更具体一些,看看这是否会使其正常工作:

add_index :TACCOUNT, :NAMEX, :length => { :NAMEX => 5 }

作为最后的手段,您可以通过调整不正确的 ADD INDEX 语句并在正确的语句上使用 execute 直接使用 SQL 以“硬方式”创建索引。

【讨论】:

  • 非常感谢。我没有意识到您可以在迁移中执行原始 SQL...现在尝试找出我们在这里使用长文本字段的原因...再次感谢!
  • 您可以在迁移中做任何您想做的事情。像add_index 这样的辅助方法只是为了您的方便。在做这样的事情时你应该小心,因为如果模式转储器无法理解你的结构,你的测试数据库可能没有应用正确的索引。如果您加载大量数据而没有预期的索引,这有时会使测试运行非常缓慢。
猜你喜欢
  • 2012-11-22
  • 1970-01-01
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
相关资源
最近更新 更多