Rails 4和PSQL 9.3中无法从表中删除索引

8
在我的 schema.rb 文件中,我有以下这行代码:
add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree

当我在 psql 中运行 \di 命令时,会得到以下输出:

Schema |                             Name                             | Type  | Owner |         Table
--------+--------------------------------------------------------------+-------+-------+-----------------------
 public | index_users_on_email                                         | index | alex  | users

然而,如果我在迁移中包括以下内容之一:

  • remove_index :users, name: :index_users_on_email
  • remove_index :users, column: :email
  • remove_index :users, :email
  • execute 'DROP INDEX index_users_on_email'

我会收到以下错误信息:

rake aborted!
An error has occurred, this and all later migrations canceled:

Index name 'index_users_on_email' on table 'users' does not exist

我也找到了这个问题。有什么想法吗?点击此处查看相关信息。
4个回答

11

我知道这个回答来得很晚,但我最近遇到了类似的问题。你在尝试移除索引之前是否重命名了“email”列?如果是这样,通过重命名该列,索引也会被移除。因此,操作顺序应该是:

1)删除索引 2)重命名列


1
这也是我的问题。我正在删除一列,然后尝试删除包括先前删除的列的索引。 - Kyril
我也遇到了同样的问题。我正在运行一个迁移,先删除了一列,然后删除了索引,结果出现了这个错误。调整了顺序之后就可以了。 - Ben Lee

8

我已经尝试过按名称删除索引,但结果还是一样。我也读了你提到的问题。不管怎样,还是谢谢你的努力。 - Alexander Popov
你应该手动检查你的数据库,看看索引是否真的存在。 - ChrisBarthol
是的,它确实存在。在 psql 中运行 \di 命令会得到以下结果:public | index_users_on_email | index | alex | users - Alexander Popov
@AlexPopov,你找到答案了吗?我在MySQL上也遇到了同样的错误。 - Ivan

2
有点晚的答案,但我刚遇到同样的问题,所以我写下这个答案,希望它能帮助未来的其他人。
原始提问者遇到的问题导致了解决方案。在Rails 3.x中,index_name_for_remove实现存在缺陷,因此有时不接受命名索引。相反,它会引发一个ArgumentError,声称该索引不存在。
在Rails 4.x中,实现已更改,以便正确处理传递索引名称的哈希(我认为,目前我没有Rails 4应用程序进行测试)。
如果您需要在Rails 3.x中处理这个问题,查看remove index的源代码会导致解决方案 - 使用remove_index!方法。remove_index!接受两个参数 - 表名和索引名。因此,在原始帖子提出的问题的情况下,这个命令应该可以解决问题:remove_index! :users, :index_users_on_email
更新:在发布答案后,我注意到原始帖子是关于Rails 4的问题,因此在某些情况下,实现index_name_for_remove仍存在问题,无法检测到正确的索引名称。但是,由于索引的名称已知,并且我们不需要实际找出名称是什么(这是index_name_for_remove在内部执行的操作),因此我们仍然可以使用remove_index!方法来删除它。

对于Rails 3,remove_index! :table_name, :index_name是有效的。谢谢! - konyak

0

我的错误:试图在我正在删除的列上删除索引。

迁移引发了PG :: UndefinedObject:ERROR:索引“index_candidates_on_job_id_and_email”不存在

class MergeJobAndJobCandidateModels < ActiveRecord::Migration[6.0]
  # ...
  def down
    change_table :candidates do |t|
      t.remove :job_id
      # ...
    end
    remove_index :candidates, %i[email job_id]
  end
end

错误:我正在删除列并尝试删除索引。Rails/Postgres会自动删除不再存在的列上的索引,所以我在迁移中删除此索引是没有必要的。
希望这能为其他遇到此错误的人节省一些时间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接