2011-01-12 8 views
0

Ich bin mit Rails 2.3.5 mit Active, Rubin 1.8.6, MySQL (2.8.1)Merging zwei Tabellen, welche die Schienen Weg

Ich habe zwei Tabellen A und B mit den exakt gleichen Säulenstrukturen. A ist auf einem separaten Server von B.

Ich mag den gesamten Inhalt von B nehmen und fügen Sie sie zu einem so

A = A + B

Irgendwelche eleganten Methoden? Ich dachte daran, einen Datensatz zu einem Zeitpunkt von B zu nehmen und nur in A, aber das scheint nicht so toll ..

+0

Ich weiß, dass die meisten Neulinge in Rails nicht den Unterschied erkennen, aber bin ich korrekt in der Annahme, dass Sie ActiveRecord mit Rails verwenden, und nicht ein anderes ORM wie Sequel oder DataMapper? – Phrogz

+0

Ja, ich benutze ActiveRecord mit Rails – Tommy

Antwort

1

Um den Inhalt einer Tabelle dauerhaft in einen anderen zu kopieren, benötigen Sie eine Variation der INSERT-Abfragesyntax. Sie geben nicht an, welches RDBMS Sie verwenden, also zeige ich Ihnen einfach, wie es mit MySQL funktioniert.

INSERT A SELECT * FROM B 

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

EDIT

Wenn Ihre Tabellen auf separaten Servern gehostet werden Sie einer von ihnen kopieren müssen, so dass sie auf der gleichen MySQL-Instanz sind.Das kann mit den mysqldump und mysql Befehle durchgeführt werden, wie:

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

oder, wenn Sie ssh verwenden möchten

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

Hmm das ist eine neue Frage. Was ist, wenn sich die Tabellen in verschiedenen Datenbanken befinden? – Tommy

+1

Kein Problem, spezifizieren Sie es einfach als 'INSERT DB1.A SELECT * FROM DB2.B' ..das heißt, Sie meinen verschiedene Datenbanken * auf dem gleichen Server *. – noodl

+0

Ja, das ist ein guter Punkt .. was ist, wenn sie auf verschiedenen Servern sind? – Tommy

2

Sie können dies zwei Orte, Ihre SQL oder in Ihrer Anwendung.

Durch eine SQL-Abfrage:

SELECT * FROM table_a 
UNION 
SELECT * FROM table_b; 

In Ihrer Rails-Anwendung:

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

Einfach genug.

UPDATE: Da Sie diese Änderung dauerhaft vornehmen möchten, sollten Sie eine Migration erstellen, die die beiden Tabellen zusammenführen wird. Dadurch wird sichergestellt, dass Rails weiß, was vor sich geht, und Sie können Ihre Produktionsdatenbank ähnlich migrieren. Da Active keine integrierte Tabelle merge hat, würden Sie wie so eine rohe SQL-Abfrage in der Migration durchführen:

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 

Dann rake db:migrate in der Befehlszeile laufen diese Aktion durchführen zu lassen.

Dies hat jedoch den Effekt, dass die Zeilen von table_b neu indexiert werden, da das Verschieben in table_a zu widersprüchlichen primären IDs führen würde.

+0

Ich denke, er will 'INSERT SELECT ...' zu verketten die Tabellen dauerhaft, nicht nur "beitreten" sie in einer Abfrage. – noodl

+0

Danke! Würde ich auf irgendwelche Probleme stoßen, wenn ich in jeder Tabelle Millionen von Einträgen habe? – Tommy

+0

Und yeah Ich möchte die Tabellen permanent verketten. – Tommy

0

Es sieht so aus, als ob ActiveRecord (im Gegensatz zu Sequel) Batch-Insert standardmäßig nicht unterstützt. Sehen Sie sich this Stack Overflow answer für eine Bibliothek an, die ActiveRecord erweitert, sodass Sie für jede Zeile ein einzelnes effizientes Update anstelle eines einzelnen SQL-Einschubs durchführen können.