49

Say, mamy coś takiego:Czy nazwa_kolumny zajmuje się indeksami?

add_column :users, :single, :boolean 
add_index :users, :single 

a potem robimy

rename_column :users, :single, :married 

Will ActiveRecord i/lub baza obsłużyć zmianę nazwy indeksu, a także, czy muszę ręcznie upuścić indeks i dodać go ponownie?

Odpowiedz

83

Dla PostgreSQL, rename_column jest zaimplementowany jako prosty ALTER TABLE ... RENAME COLUMN ... i zachowuje indeksy.

Wersje MySQL (obie z nich) wykonują numer ALTER TABLE ... CHANGE ... i zachowują również indeksy.

Wersja SQLite wydaje się skopiować całą tabelę (z indeksami), upuść starą, a następnie skopiować kopię z powrotem do oryginalnej nazwy tabeli. Kopiowanie wydaje się obsługiwać kolumna zmiany nazwy podczas kopiowania indeksów:

def copy_table(from, to, options = {}) 
    #... 
    copy_table_indexes(from, to, options[:rename] || {}) 

i wewnątrz copy_table_indexes:

columns = index.columns.map {|c| rename[c] || c }.select do |column| 
    to_column_names.include?(column) 
end 

Tak, standardowe sterowniki zachowa swoje indeksy, kiedy wykonujesz rename_column i SQLite sterownik stara się to zrobić.

Dokumentacja interfejsu API nie określa żadnego konkretnego zachowania, więc inne sterowniki mogą wykonywać inne czynności. Najbliższy dokumentacja przychodzi mówiąc nic o indeksach jest to w active_record/migration.rb:

rename_column(table_name, column_name, new_column_name): Zmienia nazwę kolumny, ale zachowuje rodzaj i treść.

Myślę, że każdy kierowca zachowałby indeksy, ale nie ma gwarancji; pisarz kierowca z pewnością byłby głupi, nie zachowując indeksów.

To nie jest ostateczna ani autorytatywna odpowiedź, ale twoje indeksy powinny być zachowane, jeśli używasz standardowego PostgreSQL, MySQL (jednego z nich) lub sterowników SQLite.


zauważyć, że chociaż sam wskaźnik przetrwa zmianę nazwy kolumny nie ma gwarancji, że indeks nazwa zostaną zmienione. Nie powinno to stanowić problemu, chyba że coś robisz (na przykład ręcznie upuszczasz), które dba o nazwę indeksu, a nie o kolumny.

Powyższe postępowanie changed in Rails 4:

  • w szynach 4,0 przy zastosowaniu kolumny lub w tablicy jest zmieniana powiązane indeksy również zmieniona. Jeśli masz migracje, które zmieniają nazwy indeksów, nie są już potrzebne.

Więc ActiveRecord będzie automatycznie zmieniać nazwy indeksów, aby dopasować nowe nazwy tabel lub kolumn podczas zmiany nazwy tabeli lub kolumny. Dzięki sequielo za heads-up w tej sprawie.

+4

Moja migracja (poprzez zmianę) skutecznie zaktualizowała indeks, ale ** nie ** nazwa indeksu. Nazwa pozostała "index_ [table_name] _on_ [old_col_name]" - Rails 3.2.11, sqlite3 –

+0

@ Sorry-Im-a-N00b: Dzięki za przypomnienie mi o tym, dodałem małą notatkę o nazwie dla potomności. –

+0

Przez "zachowanie" zakładam, że masz na myśli "zmienić nazwę", prawda? – asymmetric

Powiązane problemy