Hintergrund
Ich mag die Teilmenge bereitzustellen meine Datenbank , die eine reproduzieren erforderliche select
Abfrage. Mein Ziel ist es, meinen Computerworkflow reproduzierbar zu machen (wie in der reproduzierbaren Forschung ).
Frage
Gibt es eine Möglichkeit, diese select-Anweisung in ein Skript zu integrieren, das die abgefragten Daten in eine neue Datenbank speichert, sodass die Datenbank auf einem neuen MySQL-Server installiert werden kann und die Anweisung mit der neuen Datenbank funktioniert. Die neue Datenbank sollte keine Datensätze zusätzlich zu denen enthalten, die in der Abfrage verwendet wurden.
Update: Zur Verdeutlichung bin ich nicht an einem CSV-Dump der Abfrageergebnisse interessiert. Ich muss in der Lage sein, die Datenbank-Teilmenge zu sichern, damit sie auf einem anderen Computer installiert werden kann, und dann kann die Abfrage selbst reproduzierbar sein (und in Bezug auf dieselbe Datenmenge geändert werden).
Beispiel
Beispielsweise kann meine Analyse eine Teilmenge von Daten abfragen, für die Datensätze aus mehreren Tabellen (in diesem Beispiel 3) erforderlich sind:
select table1.id, table1.level, table2.name, table2.level
from table1 join table2 on table1.id = table2.table1_id
join table3 on table3.id = table2.table3_id
where table3.name in ('fee', 'fi', 'fo', 'fum');
Antworten:
mysqldump hat die Option --where , um eine WHERE-Klausel für eine bestimmte Tabelle auszuführen.
Obwohl es nicht möglich ist, eine Join-Abfrage zu mysqldumpen, können Sie bestimmte Zeilen aus jeder Tabelle exportieren, sodass jede aus jeder Tabelle abgerufene Zeile später in den Join einbezogen wird.
Für Ihre gegebene Abfrage müssten Sie dreimal mysqldump ausführen:
Zuerst mysqldump alle table3-Zeilen mit Namen in ('fee', 'fi', 'fo', 'fum'):
Als nächstes mysqldump alle table2-Zeilen, die übereinstimmende table3_id-Werte aus dem ersten mysqldump haben:
Dann mysqldump alle table1-Zeilen, die übereinstimmende table1_id-Werte aus dem zweiten mysqldump haben:
Hinweis: Da für den zweiten und dritten mysqldump mehr als eine Tabelle erforderlich ist, muss --lock-all-tables verwendet werden .
Erstellen Sie Ihre neue Datenbank:
Laden Sie zum Schluss die drei mysqldumps in eine andere Datenbank und versuchen Sie dort den Join in der neuen Datenbank.
Führen Sie im MySQL-Client Ihre Join-Abfrage aus
Versuche es !!!
WARNUNG: Wenn nicht korrekt indiziert, kann der zweite und dritte mysqldump ewig dauern !!!
Indizieren Sie für alle Fälle die folgenden Spalten:
Ich gehe davon aus, dass id der Primärschlüssel von table3 ist.
quelle
--where
Klausel in der Dokumentation verpasst . Lassen Sie Sie wissen, wie das funktioniert, nachdem ich die Gelegenheit habe, es auszuprobieren.Ich würde in Betracht ziehen , ein 'outfile' als Teil Ihres SELECT anstelle von mysqldump zu verwenden, um dieses Problem zu lösen. Sie können eine beliebige SELECT-Anweisung erstellen und dann am Ende "INTO OUTFILE '/path/to/outfile.csv' ..." mit der entsprechenden Konfiguration für die CSV-Ausgabe anhängen. Dann können Sie einfach die Syntax ' LOAD DATA INFILE ...' verwenden, um die Daten in Ihren neuen Schema-Speicherort zu laden.
Zum Beispiel mit Ihrem SQL:
Denken Sie daran, dass Sie auf der Zielfestplattenpartition genügend verfügbaren Speicherplatz benötigen.
quelle
Load Data Infile
diese .csv- Datei in diese neue Datenbank. Jetzt kann die Abfrage ausgeführt werden.Das mysqldump-Dienstprogramm verfügt über die Option --tables , mit der Sie angeben können, welche Tabellen gesichert werden sollen . Hier können Sie die Liste der Tabellen angeben.
Ich kenne keinen einfacheren (automatisierten) Weg.
quelle
delete from table1 where id not in (.....);
, wenn dies der einfachste Weg ist, solange das Skript werden kann automatisiert, es ist nicht notwendig , dass das spezifische Werkzeug vorhanden ist .Was für mich nützlich war, war so etwas wie:
Von http://krosinski.blogspot.com/2012/12/using-table-join-with-mysqldump.html
quelle
Haben Sie die Anführungszeichenfunktion in MySQL ausprobiert ?
Speichern Sie das obige als query.sql
quelle
In MySQL:
In der Befehlszeile:
Richten Sie auf Ihrem Zielserver ~ / .my.cnf ein
Auf Zielserver importieren
quelle
Ich habe ein kleines Skript für ein ähnliches Problem geschrieben, hier ist es: https://github.com/digitalist/mysql_slice
dh Sie haben diese Abfrage :
Du hast diesen Dump :
quelle