我正在使用Rails 2.3.5和ActiveRecord,ruby 1.8.6,mysql(2.8.1)
我有两个表A和B,它们具有完全相同的列结构。 A位于与B不同的服务器上。
我想获取B的全部内容并将它们添加到A中
A = A + B
任何优雅的方法?我想过从B一次拿一条记录,然后把它添加到A中,但这看起来不太好......
答案 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实例上。可以使用mysqldump
和mysql
命令完成此操作,例如:
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插入。