【问题标题】:How can I remove a unique constraint from a database column in Rails?如何从 Rails 中的数据库列中删除唯一约束?
【发布时间】:2015-11-03 09:22:30
【问题描述】:

我使用以下迁移创建了一个表:

class CreateProfilePictures < ActiveRecord::Migration
  def change
    create_table :profile_pictures do |t|
      t.integer :user_id, null: false
      t.integer :picture_id, null: false
      t.timestamps null: false
    end

    add_index :profile_pictures, :user_id, unique: true
    add_index :profile_pictures, :picture_id, unique: true
  end
end

我尝试使用以下内容删除约束:

class FixProfilePic < ActiveRecord::Migration
  def change
    change_column :profile_pictures, :picture_id, :integer, unique: false
  end
end

如果我尝试在多个地方使用相同的picture_id,我仍然会收到唯一约束违规错误。从picture_id中删除唯一性约束的正确方法是什么?

【问题讨论】:

  • 您需要删除index

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


【解决方案1】:

您必须删除您的索引:

remove_index :profile_pictures, :picture_id

然后再次添加:

add_index :profile_pictures, :picture_id

ActiveRecord::Migration

【讨论】:

  • 这不再有效。现在有效的是:remove_index :profile_pictures, name: 'picture_id'
  • 请注意,此迁移的回滚不会恢复 UNIQUE 约束。
【解决方案2】:

add_index :profile_pictures, :picture_id, unique: true

所以将您的索引更新为:

  remove_index :profile_pictures, :picture_id
  add_index :profile_pictures, :picture_id

我猜是这样。

【讨论】:

    【解决方案3】:

    接受的答案有问题:回滚无法正常工作,因为唯一索引未恢复。

    你可以试试这个:

    reversible do |dir|
      dir.up do
        remove_index :profile_pictures, :picture_id
        add_index :profile_pictures, :picture_id
      end
    
      dir.down do
        remove_index :profile_pictures, :picture_id
        add_index :profile_pictures, :picture_id, unique: true
      end
    end
    

    【讨论】:

    • 我已经接受了这个作为新答案
    猜你喜欢
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 2012-04-18
    • 2021-08-03
    • 2023-03-22
    • 1970-01-01
    • 2018-09-23
    相关资源
    最近更新 更多