以轨道方式合并两个表

时间:2011-01-12 22:51:12

标签: ruby-on-rails activerecord

我正在使用Rails 2.3.5和ActiveRecord,ruby 1.8.6,mysql(2.8.1)

我有两个表A和B,它们具有完全相同的列结构。 A位于与B不同的服务器上。

我想获取B的全部内容并将它们添加到A中

A = A + B

任何优雅的方法?我想过从B一次拿一条记录,然后把它添加到A中,但这看起来不太好......

3 个答案:

答案 0 :(得分:2)

您可以在这两个地方,您的SQL或您的应用程序中执行此操作。

通过SQL查询:

SELECT * FROM table_a
UNION
SELECT * FROM table_b;

在您的Rails应用程序中:

a = A.all
b = B.all
ab = a + b

足够简单。

<强>更新 由于您要永久地进行此更改,因此应创建将两个表合并在一起的迁移。这将确保Rails知道发生了什么,并且它将允许您以类似方式迁移生产数据库。因为ActiveRecord没有内置表合并,所以您将在迁移中执行原始SQL查询,如下所示:

class MergeTableAWithTableB < ActiveRecord::Migration
  def self.up
    execute "INSERT INTO `table_a` (field_1, field_2, field_3) SELECT (field_1, field_2, field_3) FROM `table_b`;"
    drop_table :table_b
  end

  def self.down
    raise IrreversibleMigration
  end
end

然后在命令行运行rake db:migrate以执行此操作。

这样可以重新索引table_b中的行,因为将它们移到table_a会导致主要ID出现冲突。

答案 1 :(得分:1)

要将一个表的内容永久复制到另一个表,您需要使用INSERT查询语法的变体。你没有指定你正在使用哪个RDBMS,所以我将继续展示它如何与MySQL一起工作。

INSERT A SELECT * FROM B

http://dev.mysql.com/doc/refman/5.1/en/insert-select.html

修改

如果您的表托管在不同的服务器上,则需要复制其中一个,以便它们位于同一个MySQL实例上。可以使用mysqldumpmysql命令完成此操作,例如:

mysqldump -h <hostname> <database_name> <table_name> |mysql -h <other_hostname> <other_database_name>

或者,如果您更喜欢使用ssh

ssh <hostname> mysqldump <database_name> <table_name> |ssh <other_hostname> mysql <other_database_name>

答案 2 :(得分:0)

看起来ActiveRecord(与Sequel不同)默认情况下不支持批量插入。查看this Stack Overflow answer以获取扩展ActiveRecord的库,以便您可以执行单个有效更新,而不是每行一个SQL插入。