[英]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
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.