gpt4 book ai didi

ruby-on-rails - rename_column 是否负责索引?

转载 作者:行者123 更新时间:2023-12-03 05:46:00 24 4
gpt4 key购买 nike

比如说,我们有这样的东西:

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

然后我们就这样做

rename_column :users, :single, :married

ActiveRecord 和/或数据库是否也会处理索引的重命名,或者我是否必须手动删除索引并再次添加它?

最佳答案

对于 PostgreSQL,rename_column 是作为一个简单的 ALTER TABLE ... RENAME COLUMN ... 实现的,并且确实保留了索引。

MySQL 版本(两者)都会执行ALTER TABLE ... CHANGE ...,并且还保留索引。

SQLite 版本似乎会复制整个表(带有索引),删除旧表,然后将副本复制回原始表名。复制似乎确实在复制索引时处理列重命名:

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

以及copy_table_indexes内部:

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

因此,当您执行rename_column时,标准驱动程序将保留您的索引,并且 SQLite 驱动程序会尽力做到这一点。

API 文档没有指定任何特定行为,因此其他驱动程序可能会执行其他操作。文档中最接近关于索引的内容是 active_record/migration.rb 中的内容:

rename_column(table_name, column_name, new_column_name): Renames a column but keeps the type and content.

我认为任何驱动程序都会保留索引,但不能保证;驱动程序编写者不保留索引肯定是愚蠢的。

这不是一个明确或权威的答案,但如果您使用标准 PostgreSQL、MySQL(其中之一)或 SQLite 驱动程序,则应该保留您的索引。

<小时/>

请注意,即使索引本身在列重命名后仍然存在,也不能保证索引名称会被更改。这应该不是问题,除非您正在做一些关心索引名称而不是涉及哪些列的事情(例如手动删除它)。

上述行为changed in Rails 4 :

  • In Rails 4.0 when a column or a table is renamed the related indexes are also renamed. If you have migrations which rename the indexes, they are no longer needed.

因此,当您重命名表或列时,ActiveRecord 会自动重命名索引以匹配新的表或列名称。感谢sequielo请注意这一点。

关于ruby-on-rails - rename_column 是否负责索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6732896/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com