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

それらはプライマリ インデックスではありません。1 つのインデックス プライマリ (execute によって追加された) と 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 に答える