带表达式的多列索引(PostgreSQL 和 Rails)
Posted
技术标签:
【中文标题】带表达式的多列索引(PostgreSQL 和 Rails)【英文标题】:Multicolumn index with expression (PostgreSQL and Rails) 【发布时间】:2017-05-06 13:19:03 【问题描述】:我需要为 3 列(VARCHAR
、INT
和 INT
)创建多列索引,我们称它们为 varchar_col
、int1_col
和 int2_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)的主要内容,如果未能解决你的问题,请参考以下文章