Wie alle Tabellen in MySQL mit bestimmten Spaltennamen in ihnen zu finden?
-
10-07-2019 - |
Frage
Ich habe 2-3 verschiedene Spaltennamen, die ich im gesamten DB nachschlagen möchten und alle Tabellen, die diese Spalten auflisten. Jede einfache Skript?
Lösung
Um alle Tabellen zu erhalten mit Spalten columnA
oder ColumnB
in der Datenbank YourDatabase
:
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('columnA','ColumnB')
AND TABLE_SCHEMA='YourDatabase';
Andere Tipps
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%wild%';
Mehr einfach in einer Zeile von SQL getan:
SELECT * FROM information_schema.columns WHERE column_name = 'column_name';
SELECT DISTINCT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE column_name LIKE 'employee%'
AND TABLE_SCHEMA='YourDatabase'
In der Version, die information_schema
(ältere Versionen oder etwas NDB) nicht haben Sie die Tabellenstruktur abladen können und die Spalte manuell suchen.
mysqldump -h$host -u$user -p$pass --compact --no-data --all-databases > some_file.sql
Jetzt die Spaltennamen in some_file.sql
suchen Sie Ihren bevorzugten Texteditor, oder einig netten awk-Skripte verwenden.
Und ein einfacher sed-Skript um die Spalte zu finden, ersetzen Sie einfach COLUMN_NAME mit den:
sed -n '/^USE/{h};/^CREATE/{H;x;s/\nCREATE.*\n/\n/;x};/COLUMN_NAME/{x;p};' <some_file.sql
USE `DATABASE_NAME`;
CREATE TABLE `TABLE_NAME` (
`COLUMN_NAME` varchar(10) NOT NULL,
Sie können über die Pipeline den Dump direkt in sed aber das ist trivial.
Für diejenigen, für die Umkehrung dieser Suche, das heißt für Tabellen suchen, hier nicht ein bestimmten Spaltennamen enthalten, ist die Abfrage ...
SELECT DISTINCT TABLE_NAME FROM information_schema.columns WHERE
TABLE_SCHEMA = 'your_db_name' AND TABLE_NAME NOT IN (SELECT DISTINCT
TABLE_NAME FROM information_schema.columns WHERE column_name =
'column_name' AND TABLE_SCHEMA = 'your_db_name');
Das kam wirklich praktisch, wenn wir langsam Verwendung von InnoDB Sonder ai_col
Säule umzusetzen begannen und welche unsere 200 Tabellen noch aufgerüstet werden mußten, um herauszufinden, benötigt werden.
Wenn Sie " Um alle Tabellen bekommen nur ", dann ist diese Abfrage verwenden:
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME like '%'
and TABLE_SCHEMA = 'tresbu_lk'
Wenn Sie " Um alle Tabellen mit Spalten zu erhalten ", dann ist diese Abfrage verwenden:
SELECT DISTINCT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE column_name LIKE '%'
AND TABLE_SCHEMA='tresbu_lk'
Verwenden Sie diese eine Zeile Abfrage ersetzen desired_column_name durch Ihre Spaltennamen.
SELECT TABLE_NAME FROM information_schema.columns WHERE column_name = 'desired_column_name';
SELECT DISTINCT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE '%city_id%' AND TABLE_SCHEMA='database'
Das Problem mit information_schema ist, dass es schrecklich langsam sein kann. Es ist schneller, die SHOW-Kommandos zu verwenden.
Nachdem Sie die Datenbank wählen Sie zunächst die Abfrage SHOW TABLES senden. Und dann haben Sie SHOW COLUMNS für jede der Tabellen.
In PHP, die wie folgt aussehen würde etwas
$res = mysqli_query("SHOW TABLES"); while($row = mysqli_fetch_array($res)) { $rs2 = mysqli_query("SHOW COLUMNS FROM ".$row[0]); while($rw2 = mysqli_fetch_array($rs2)) { if($rw2[0] == $target) .... } }