带表达式的多列索引(PostgreSQL和Rails)

时间:2017-05-06 13:19:03

标签: sql ruby-on-rails postgresql

我需要为3列(VARCHARINTINT)创建多列索引,让我们称之为varchar_colint1_col和{{1 }}。对于int2_col列,我需要应用VARCHAR表达式。

当我使用表达式

创建单列索引时
lower(varchar_col)

它有效,但当我尝试使用

创建多列时
add_index :table, 'lower(varchar_col)', name: 'index_name'

我收到了

  

PG :: UndefinedColumn:ERROR:column" lower(varchar_col)"不存在

是否可以使用Rails add_index :table, ['lower(varchar_col)', :int1_col, :int2_col], name: 'index_name' 函数创建这样的索引,或者我需要在迁移文件中执行SQL查询? PostgreSQL是否支持带表达式的多列索引?如果它支持,我必须在迁移文件中写什么才能使它有效?

感谢您的帮助!

P.S。我使用Rails 5。

2 个答案:

答案 0 :(得分:3)

您可以将带有表达式的列作为字符串发送:

add_index :table, 'lower(varchar_col), int1_col, int2_col', name: 'index_name'

答案 1 :(得分:0)

因此,经过一番研究,我已经在迁移文件中执行了SQL查询。我只是将它留在这里作为另一种方法,但Ilya Lavrov的建议也是有效的。

迁移文件

def up
  connection.execute(%q{
    CREATE INDEX index_name ON table(lower(varchar_col), int1_col, int2_col)
  })
end

def down
  remove_index :table, name: 'index_name'
end