如何从Rails中的数据库列中删除唯一约束?

Dan*_*iel 24 sql ruby-on-rails rails-migrations

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

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
Run Code Online (Sandbox Code Playgroud)

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

class FixProfilePic < ActiveRecord::Migration
  def change
    change_column :profile_pictures, :picture_id, :integer, unique: false
  end
end
Run Code Online (Sandbox Code Playgroud)

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

小智 43

您必须删除索引:

remove_index :profile_pictures, :picture_id
Run Code Online (Sandbox Code Playgroud)

并再次添加:

add_index :profile_pictures, :picture_id
Run Code Online (Sandbox Code Playgroud)

ActiveRecord的::迁移

  • 请注意,回滚此迁移不会恢复 UNIQUE 约束。 (2认同)

Bry*_*mar 9

add_index:profile_pictures,:picture_id,unique:true

所以将索引更新为:

  remove_index :profile_pictures, :picture_id
  add_index :profile_pictures, :picture_id
Run Code Online (Sandbox Code Playgroud)

我猜这就是它.


And*_*art 6

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

你可以试试这个:

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
Run Code Online (Sandbox Code Playgroud)

  • 我已接受此作为新答案 (2认同)