Rails迁移,如何以批处理模式向表中添加多个列

时间:2017-12-12 10:06:02

标签: ruby-on-rails optimization migration alter-table

当我想在现有表中添加多个列时,我可以这样做:

rails g migration AddColumnsToUser col1:integer col2:integer .. etc.

这将生成一个包含多行的迁移:

def change
  add_column :users, :col1, :integer
  add_column :users, :col2, :integer
end

将在几个alter table命令中将其转换为后端数据库:

ALTER TABLE users ADD COLUMN col1 SMALLINT(6) NOT NULL;
ALTER TABLE users ADD COLUMN col2 SMALLINT(6) NOT NULL;

问题在于,如果你正在处理一个大表,那么这些alter table中的每一个都会花费很多时间,而不是MySQL,因为后端引擎会产生表的重复,并且会做很多昂贵的流程。所有这些工作都必须为我想要添加的每一列完成。

所以,我的问题是,如何将所有这些add_column句子聚合在一起,这样结果将是批处理模式中的alter table,如下所示:

ALTER TABLE users
    ADD COLUMN col1 SMALLINT(6) NOT NULL,
    ADD COLUMN col2 SMALLINT(6) NOT NULL;

2 个答案:

答案 0 :(得分:3)

答案 1 :(得分:0)

如果您想要多个语句或自定义SQL,请执行以下操作:

execute <<-SQL
   ALTER TABLE users
    ADD COLUMN col1 SMALLINT(6) NOT NULL,
    ADD COLUMN col2 SMALLINT(6) NOT NULL;
SQL