2016-04-09 5 views
1

Ich habe Dutzende von Datenbanken in MySQL und alle von ihnen haben Tabelle log mit der gleichen Struktur. Gibt es einen einfachen Weg (eine Zeile oder ein paar Zeilen SQL), um Daten aus all diesen ähnlichen Tabellen in allen Datenbanken aufzulisten? Ohne die Notwendigkeit, alle Datenbanknamen zu schreiben?Wie listet man Tabellendaten aus mehreren MySQL-Datenbanken auf?

Vielen Dank für Ihre Hilfe im Voraus.

+0

notwendig sein, brauchen Sie in der Lage sein, die Quelldatenbank für jede Zeile in der resultierenden Ausgabe zu identifizieren? Die Datenbanken und Tabellen können dynamisch aus 'information_schema.TABLES' erstellt und zum Erstellen einer Union-Abfrage verwendet werden. –

+0

Ich verstehe nicht, warum jemand diese Frage ablehnt und nicht einmal seine Gründe erzählt. – Frodik

Antwort

2

Die Systemtabelle information_schema.TABLES enthält Tabelleninformationen, einschließlich des Schemas (Datenbank), dem die Tabelle gehört. Sie könnten das verwenden, um eine UNION ALL Abfrage zu erstellen, die alle log Tabellen durch clevere Verkettung mit GROUP_CONCAT() kombiniert.

Anstelle des Standardtrennzeichens , wird jedoch ein skeletales SQL-Fragment UNION ALL SELECT col, col2, col3.. als Trennzeichen verwendet. Das Ergebnis wird eine Abfrage, die wie folgt aussieht:

SELECT col, col2, col3 FROM db1.log 
UNION ALL SELECT col, col2, col3 FROM db2.log 
UNION ALL SELECT col, col2, col3 FROM db3.log... 

Die Abfrage etwas zum Effekt von sein wird:

SELECT CONCAT('SELECT col1, col2, col3 FROM ', 
    GROUP_CONCAT(CONCAT(TABLE_SCHEMA, '.log') SEPARATOR ' UNION ALL SELECT col1, col2, col3 FROM ')) 
FROM information_schema.TABLES 
WHERE TABLE_NAME = 'log'; 

Die äußere CONCAT() stellt sicher, dass die SELECT cols... FROM die Abfrage beginnt. Das GROUP_CONCAT() sammelt alle Datenbanken zusammen in einer Zeile, die von der Komponente verbunden werden, und die CONCAT(TABLE_SCHEMA, '.log') qualifiziert die dynamisch abgerufenen Datenbank-Namen mit dem log Tabellenname.

Es mag verlockend sein, SELECT * zu verwenden, aber ich würde es vermeiden, wenn die Tabellen nicht alle Spalten in der gleichen Reihenfolge haben.

Dies gibt eine vollständige SQL-Zeichenfolge aus, die Sie dann in einem beliebigen Client ausführen können. Es wäre auch möglich, dies in den Körper einer CREATE PROCEDURE, die die Zeichenfolge erstellt dann PREPARE und darauf platzieren. Im Allgemeinen ist dies die Form nimmt:

SET @qry = 'SELECT CONCAT(\'SELECT col1, col2, col3 FROM \', GROUP_CONCAT(....' 
PREPARE stmt FROM @qry; 
EXECUTE stmt; 

, dass in diesem Zusammenhang Denken Sie daran, ist die SQL ein String die in ihrer Gesamtheit in einfachen Anführungszeichen sein müssen, müssen Sie die Anführungszeichen in ihr Backslash.

Endlich, eine Notiz über Bezeichner Zitat. Der Code, den ich hier habe, setzt voraus, dass Ihre Datenbanknamen niemals Backtick-Quoting erfordern. Je nachdem, wie Sie Ihre Datenbanken genannt werden, kann es zu CONCAT() Backticks wie

CONCAT('`', TABLE_SCHEMA, '`') 
+0

Große Antwort, danke. Ich habe Ihr SQL ein wenig bearbeitet, um auch den Namen jeder Tabelle in einer Spalte zu erhalten. Es geht so: 'SELECT CONCAT ('SELECT Spalte1, Spalte2, Spalte3,', GROUP_CONCAT (CONCAT ('' ', TABLE_SCHEMA,' AS Tabellenname ',' FROM ', TABLE_SCHEMA,'. Log ') SEPARATOR' UNION ALL SELECT Spalte1, Spalte2, Spalte3, ')) FROM information_schema.TABLES WHERE TABLE_NAME =' log '; ' – Frodik

Verwandte Themen