【问题标题】:Double primary key indexes with Rails and PostgreSQLRails 和 PostgreSQL 的双主键索引
【发布时间】:2013-01-20 06:10:49
【问题描述】:

我在我的表中使用 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) 我猜这来自创建“XXX_pkey”索引的ADD PRIMARY KEY,我可以在此迁移和正在运行的数据库中安全地删除add_index :accounts, :uuid, :unique =&gt; true

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      它们不是主索引,如何有一个索引主索引(由执行添加)和一个唯一索引(由 add_index 添加)。主键和唯一索引是有区别的。主键不接受 NULL 而唯一的。如果您需要删除索引,只需创建一个将删除索引的迁移:

      remove_index(table_name, :column =&gt; column_name): Removes the index specified by column_name.

      来源:http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-20
        • 2010-11-01
        相关资源
        最近更新 更多