【问题标题】:Use Rails Migrations to delete an index without knowing its name使用 Rails Migrations 在不知道其名称的情况下删除索引
【发布时间】:2010-11-23 00:17:29
【问题描述】:

我有一个表,其中包含不是通过 rails 迁移创建的复合索引。现在,我需要创建一个 Rails 迁移,它将删除此索引并创建一个新索引,但我不一定知道索引的名称是什么。

我知道可以在迁移步骤中获取表名和列名的列表。是否可以获取特定表上的索引名称列表?或者,换个角度来看,是否可以删除表上的所有索引?或者是编写我自己的特定于数据库的 SQL 查询来获取此信息的唯一选择?

【问题讨论】:

    标签: ruby-on-rails database indexing migration


    【解决方案1】:

    您可以直接从数据库中获取信息。如果您使用的是 MySQL:

    >> select TABLE_NAME, INDEX_NAME from information_schema.statistics WHERE TABLE_SCHEMA = 'your_database_name';
    

    您只需要替换 your_database_name 位。您将需要 information_schema 数据库的权限(或以 root 身份登录)。

    【讨论】:

    • 这似乎是mysql特有的;例如,它不适用于 postgresql。我认为 OP 试图避免这种情况。
    【解决方案2】:

    您可以通过以下方式获取表上所有索引的详细信息:

    ActiveRecord::Base.connection.indexes('tablename')
    

    这会返回一个ActiveRecord::ConnectionAdapters::IndexDefinition 对象数组,每个对象都有一个#name#columns 方法。

    【讨论】:

      【解决方案3】:

      为了扩展@showaltb 的出色答案,这是一个完整的迁移,用于删除表上的所有索引,而不知道它们的名称:

      ActiveRecord::Base.connection.indexes('tablename').each do |index|
        remove_index 'tablename', name: index.name
      end
      

      【讨论】:

        猜你喜欢
        • 2021-01-05
        • 2013-08-06
        • 1970-01-01
        • 2012-02-18
        • 2023-03-10
        • 1970-01-01
        • 2010-11-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多