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, '`')
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. –
Ich verstehe nicht, warum jemand diese Frage ablehnt und nicht einmal seine Gründe erzählt. – Frodik