使用Rails迁移删除索引而不知道其名称

时间:2009-08-26 13:32:07

标签: ruby-on-rails database indexing migration

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

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

3 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:3)

要扩展@ showaltb的最佳答案,这里是一个完整的迁移,用于删除表中的所有索引,而不知道它们的名称:

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

答案 2 :(得分:1)

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

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

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