簡體   English   中英

如何從 Rails 中的數據庫列中刪除唯一約束?

[英]How can I remove a unique constraint from a database column in Rails?

我使用以下遷移創建了一個表:

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 中刪除唯一性約束的正確方法是什么?

您必須使用以下命令刪除索引:

remove_index :profile_pictures, :picture_id

並再次添加:

add_index :profile_pictures, :picture_id

ActiveRecord::遷移

add_index :profile_pictures, :picture_id, 唯一: true

因此,將您的索引更新為:

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

我猜是這個

接受的答案存在問題:回滾無法正常工作,因為未恢復唯一索引。

你可以試試這個:

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

為了使遷移可逆,您現在(Rails 6+)需要使用:column選項。

添加unique: true還確保回滾遷移將重新創建具有唯一性約束的索引(除非同時插入有問題的數據)。

  remove_index :profile_pictures, column: :picture_id, unique: true
  add_index :profile_pictures, :picture_id

還有一點需要注意:如果您的表很大,那么在其上創建新索引可能會長時間鎖定對其的寫入。 考慮使用algorithm: :concurrently如果你使用 Postgres

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM