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

Posted

技术标签:

【中文标题】带表达式的多列索引(PostgreSQL 和 Rails)【英文标题】:Multicolumn index with expression (PostgreSQL and Rails) 【发布时间】:2017-05-06 13:19:03 【问题描述】:

我需要为 3 列(VARCHARINTINT)创建多列索引,我们称它们为 varchar_colint1_colint2_col。对于VARCHAR 列,我需要应用lower(varchar_col) 表达式。

当我用表达式创建单列索引时

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

它可以工作,但是当我尝试用

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

我收到

PG::UndefinedColumn: 错误:列“lower(varchar_col)”不存在

是否可以使用 Rails add_index 函数创建这样的索引,或者我需要在迁移文件中执行 SQL 查询? PostgreSQL 是否支持带表达式的多列索引?如果它支持,我必须在迁移文件中写什么才能让它工作?

感谢您的帮助!

附:我正在使用 Rails 5。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

太好了,谢谢!虽然我已经在迁移文件中执行 SQL 查询,但我已经在下面添加了答案。【参考方案2】:

所以,经过一番研究,我已经在迁移文件中执行 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

【讨论】:

以上是关于带表达式的多列索引(PostgreSQL 和 Rails)的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 多列索引,包括数组

postgresql:具有外键的多个多列索引?

Postgresql:适用于(时间戳,字符串)的多列索引

PostgreSQL 多列索引未完全使用

选择最小值时不使用索引的PostgreSQL多列组

postgresql 9.6 建立多列索引测试