【问题标题】:How do I reverse a Postgresql unique index constraint in a rails migration?如何在 Rails 迁移中反转 Postgresql 唯一索引约束?
【发布时间】:2016-01-10 20:22:59
【问题描述】:

我在我的模型上创建了一个唯一索引,如下所示:

add_index(:courses, :name, unique: true)

我不再要求名称是唯一的。我想我和this person有同样的问题,所以我尝试了这些建议,但无济于事。

当我尝试添加同名记录时,我收到类似“ActiveRecord::RecordNotUnique: PG::UniqueViolation: 错误:重复键值违反唯一约束“index_courses_on_name”之类的错误。

要删除我尝试过的唯一约束:

  1. remove_index :courses, :name

    (迁移成功,但后来我得到同样的错误,提示仍然存在唯一性约束)

  2. execute "ALTER TABLE courses DROP CONSTRAINT unique_index_courses_on_name"

  3. execute "ALTER TABLE courses DROP CONSTRAINT index_courses_on_name"

  4. execute "ALTER TABLE courses DROP CONSTRAINT unique_name"

  5. execute "ALTER TABLE courses DROP CONSTRAINT name"

  6. execute "ALTER TABLE courses DROP INDEX index_courses_on_name"

  7. execute "ALTER TABLE courses DROP INDEX courses_on_name"

  8. execute "DROP INDEX unique_courses_name"

(PG::UndefinedObject:错误:索引“unique_courses_name”不存在)

  1. execute "ALTER TABLE courses disable CONSTRAINT unique_courses_name"

(PG::SyntaxError: ERROR: "CONSTRAINT" 或附近的语法错误 第 1 行:ALTER TABLE 课程禁用 CONSTRAINT unique_courses_name)

  1. execute "ALTER TABLE courses DROP INDEX unique_courses_name"

我正在使用 psql 9.4.4、Rails 4.2 和我的最后一点理智。谢谢大家。

【问题讨论】:

  • 显示来自psql的表定义,例如\dt courses
  • @craig - 它说在 dev 中没有找到任何关系,并且在生产中找不到数据库连接(我猜是因为它是数据库的 URL,而不是 Heroku 上的 /var)。我将调查为什么我会收到此错误,尽管它看起来工作正常。

标签: ruby-on-rails postgresql rails-migrations


【解决方案1】:

如果您删除旧索引并重新添加它,我认为将删除唯一性

class RemoveUniqueFromCoursesName < ActiveRecord::Migration
  def change
    remove_index(:courses, :name)
    add_index(:courses, :name)
  end
end

【讨论】:

  • 我同意这个 应该 工作,就像我在迁移运行上面的尝试 #1 中一样,但 db 约束仍然存在,阻止我添加具有重复名称的记录。我认为错误在我的配置中更深,这只是症状。
猜你喜欢
  • 2018-12-02
  • 1970-01-01
  • 2020-08-14
  • 2018-02-20
  • 2011-07-19
  • 1970-01-01
  • 2015-12-29
  • 2011-03-18
  • 2018-01-31
相关资源
最近更新 更多