使用Rails和PostgreSQL的双主键索引

时间:2013-02-05 10:35:30

标签: ruby-on-rails ruby-on-rails-3 postgresql rails-activerecord

我在我的表中使用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列上有双索引:

Double indexes on the primary key

(1)我想这来自ADD PRIMARY KEY创建了“XXX_pkey”索引,我可以安全地删除此迁移中的add_index :accounts, :uuid, :unique => true以及正在运行的数据库吗?

(2)我可以看到只使用手动添加的索引,而不是自动添加的索引。这是随机的吗?

(3)应该删除哪些索引以及通过Rails迁移在生产中执行此操作的最佳方法是什么?

2 个答案:

答案 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 ...一样简单)