2012-06-04 2 views
2

Я индекс определяется какКак изменить индекс, определенный в таблице?

add_index :users, :email, :unique => true 

Есть ли способ, чтобы изменить этот показатель к падению ограничения уникальности, что-то вроде «change_index»?
Или это единственный способ отбросить индекс и добавить его снова без ограничения UNIQUE?

ответ

2

Различные типы индексов обычно применяются по-разному в базе данных, которую вы используете. Первичный индекс сильно отличается от любого вторичного индекса. И уникальные индексы, как правило, отличаются от индексов поиска, чтобы облегчить их основной случай использования: до быстро определить, присутствует ли значение в столбце, что позволяет эффективно выполнять поиск.

Как таковой (в зависимости от вашей СУБД) вы не можете изменить существующий индекс. Самая безопасная ставка в любом случае - это падение индекса и создание нового. Это можно сделать во время живых операций. Нет необходимости отключать ни базу данных, ни приложение rails.

1

Там нет «change_index» в миграции, так что вы можете сделать:

remove_index :users, :email

add_index :users, :email, :unique => false

0

Это должно быть сделано в два этапа - первый создания индекса нужно в одной миграции файл и отбрасывая существующее в другом.

Первый файл:

class AddNewIndex < ActiveRecord::Migration 
    disable_ddl_transaction! 

    def change 
    add_index(
     :users, 
     :email, 
     unique: false, 
     name: "index_non_unique_emails_on_users", 
     algorithm: :concurrently 
    ) 
    end 
end 

Второй файл:

class DropOldListCIndexFromPushLogs < ActiveRecord::Migration 
    def change 
    remove_index(
     :users, 
     name: <existing unique index name> # have a look in db/schema.rb 
    ) if index_exists?(:users, name: "index_non_unique_emails_on_users") 
    end 
end 

Пожалуйста, посмотрите на Zero Downtime Migrations' readme, если вы новичок в безопасные миграции.

Смежные вопросы