【问题标题】:Multicolumn index with expression (PostgreSQL and Rails)带表达式的多列索引(PostgreSQL 和 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。

【问题讨论】:

    标签: sql ruby-on-rails postgresql


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-10
      • 2011-02-13
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 2011-06-20
      • 2013-01-20
      相关资源
      最近更新 更多