1

我在我的表中使用 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 的迁移在生产中做到这一点的最佳方法是什么?

4

2 回答 2

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

于 2013-02-05T10:51:49.477 回答
1

定义为主键的列(根据定义)是唯一的。PostgreSQL(实际上是每个 DBMS)会自动创建一个唯一索引来确保这一点。

因此无需手动创建额外的唯一索引。

所以你应该删除你手动创建的那个(我不知道 Ruby,在普通 SQL 中这很简单drop index ...

于 2013-02-10T15:05:39.443 回答