Pour PostgreSQL, rename_column
est mis en œuvre comme un simple ALTER TABLE ... RENAME COLUMN ...
et cela préserve les index.
Les versions de MySQL (les deux) font un ALTER TABLE ... CHANGE ...
et cela préserve également les index.
La version SQLite semble copier la table entière (avec les index), supprimer l'ancienne, puis recopier la copie au nom de la table originale. La copie semble gérer le renommage des colonnes tout en copiant les index :
def copy_table(from, to, options = {})
#...
copy_table_indexes(from, to, options[:rename] || {})
et à l'intérieur copy_table_indexes
:
columns = index.columns.map {|c| rename[c] || c }.select do |column|
to_column_names.include?(column)
end
Ainsi, les pilotes standard préservent vos index lorsque vous faites un rename_column
et le pilote SQLite fait des efforts pour le faire.
La documentation de l'API ne spécifie pas de comportement particulier, donc d'autres pilotes peuvent faire d'autres choses. L'élément le plus proche de la documentation concernant les index est l'élément suivant dans la section active_record/migration.rb
:
rename_column(table_name, column_name, new_column_name)
: Renomme une colonne mais conserve le type et le contenu.
Je pense que n'importe quel pilote préserverait les index mais il n'y a aucune garantie ; un auteur de pilote serait certainement stupide de ne pas préserver les index.
Ce n'est pas une réponse définitive ou faisant autorité, mais vos index devraient être préservés si vous utilisez les pilotes standard PostgreSQL, MySQL (l'un ou l'autre) ou SQLite.
Notez que même si l'index lui-même survit au renommage de la colonne, il n'y a aucune garantie que l'indice nom sera modifié. Cela ne devrait pas poser de problème, à moins que vous ne fassiez quelque chose (comme l'abandonner manuellement) qui se préoccupe du nom de l'index plutôt que des colonnes concernées.
Le comportement ci-dessus changé dans Rails 4 :
- Dans Rails 4.0, lorsqu'une colonne ou une table est renommée, les index associés sont également renommés. Si vous avez des migrations qui renomment les index, ils ne sont plus nécessaires.
Ainsi, ActiveRecord renommera automatiquement les index pour correspondre aux nouveaux noms de table ou de colonne lorsque vous renommerez la table ou la colonne. Merci à sequielo pour l'information sur ce sujet.