【问题标题】:Merging two tables the rails way以rails方式合并两个表
【发布时间】:2011-01-12 22:51:11
【问题描述】:

我正在使用带有 ActiveRecord 的 Rails 2.3.5、ruby 1.8.6、mysql (2.8.1)

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

我想把B的全部内容添加到A所以

A = A + B

有什么优雅的方法吗?我想过一次从 B 中取出一条记录,然后将其添加到 A 中,但这似乎不太好..

【问题讨论】:

  • 我知道大多数 Rails 新手并没有认识到其中的区别,但我是否正确假设您使用的是带有 Rails 的 ActiveRecord,而不是其他一些 ORM,例如 Sequel 或 DataMapper?跨度>
  • 是的,我在 Rails 中使用 ActiveRecord

标签: ruby-on-rails activerecord


【解决方案1】:

您可以在两个地方执行此操作,您的 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 冲突。

【讨论】:

  • 我认为他想做INSERT SELECT ... 来永久连接表,而不仅仅是在查询中“加入”它们。
  • 谢谢!如果每个表中有数百万个条目,我会遇到任何问题吗?
  • 如果您在内存中加载数百万行,那么您将遇到性能问题。为了以注重性能的方式执行此类操作,您应该使用流式传输或将任务分块。
  • 要永久修改表,您应该创建一个迁移。我会更新我的答案...
【解决方案2】:

要将一个表的内容永久复制到另一个表,您需要使用 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>

【讨论】:

  • 嗯,这是一个新手问题。如果表在不同的数据库上怎么办?
  • 没问题,只需将其指定为INSERT DB1.A SELECT * FROM DB2.B ..假设您指的是同一服务器上的不同数据库
  • 是的,这很好。如果他们在不同的服务器上怎么办?
  • 您还没有告诉我们您使用的是什么数据库软件。总是很难在摘要中回答这样的问题。我们(@coreyward,@Phrogz)已经误认为您的原始问题意味着您只想要一个临时的 UNION 查询。你能试着更具体一点吗?如果可能,也更新您的问题,而不是在 cmets 中进行此对话。
  • 抱歉,我更新了我的问题。如果您需要更多信息,请告诉我!
【解决方案3】:

看起来 ActiveRecord(不像Sequel)默认不支持批量插入。查看 this Stack Overflow answer 以获取扩展 ActiveRecord 的库,这样您就可以进行一次有效的更新,而不是为每一行插入一次 SQL。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 2016-01-23
    • 2016-06-17
    • 2022-01-16
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    相关资源
    最近更新 更多