我在我的表中使用UUID作为主键,以这种方式创建:
迁移:
class CreateAccounts < ActiveRecord::Migration
def change
create_table :accounts, :id => false do |t|
t.uuid :uuid, :null => false
t.timestamps
end
execute "ALTER TABLE accounts ADD PRIMARY KEY (uuid);"
add_index :accounts, :uuid, :unique => true
end
end
型号:
class Account < ActiveRecord::Base
primary_key = :uuid
base.default_value_for(:uuid, :allows_nil => false) { UUIDTools::UUID.random_create.to_s }
end
但我现在看到主键UUID列上有双索引:
(1)我想这来自ADD PRIMARY KEY
创建了“XXX_pkey”索引,我可以安全地删除此迁移中的add_index :accounts, :uuid, :unique => true
以及正在运行的数据库吗?
(2)我可以看到只使用手动添加的索引,而不是自动添加的索引。这是随机的吗?
(3)应该删除哪些索引以及通过Rails迁移在生产中执行此操作的最佳方法是什么?
答案 0 :(得分:1)
它们不是主索引,一个索引主要(由执行添加)和一个唯一(由add_index添加)。主键和唯一索引之间存在差异。主键在唯一的情况下不接受NULL。如果需要删除索引,只需创建一个将删除索引的迁移:
remove_index(table_name, :column => column_name): Removes the index specified by column_name
。
来源:http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
答案 1 :(得分:1)
定义为主键的列(根据定义)是唯一的。 PostgreSQL(实际上每个DBMS)都会自动创建一个唯一的索引来确保这一点。
因此无需手动创建其他唯一索引。
所以你应该删除你手动创建的那个(我不知道Ruby,在普通的SQL中这就像drop index ...
一样简单)