Wie finde ich alle Tabellen in MySQL mit bestimmten Spaltennamen?

Antworten:

1397

So rufen Sie alle Tabellen mit Spalten columnAoder ColumnBin der Datenbank ab YourDatabase:

SELECT DISTINCT TABLE_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME IN ('columnA','ColumnB')
        AND TABLE_SCHEMA='YourDatabase';
Ken
quelle
6
@Echo - Sie können immer mit mysqldump mit --skip-extended-insert spielen und dann durch die Datei grep ... schmutzig, aber seltsam befriedigend :)
Ken
1
@Echo, für Versionen vor 5 die Struktur mit mysqldump in eine Datei sichern, siehe meine Antwort.
Radu Maris
8
Sie können DATABASE()anstelle einer Zeichenfolge auch in der aktuell ausgewählten Datenbank suchen.
Sherlock
1
@ Ken: Gibt es eine Möglichkeit, Ihrer Abfrage einen weiteren Filter hinzuzufügen? In der Tat Auswahl der Tabellen, in denen de columnA einen bestimmten Wert hat.
Fred FLECHE
2
@FredFLECHE Ich denke, in diesem Stadium würde ich sie einfach in einem Skript durchlaufen und es einfach halten
Ken
176
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%wild%';
GSerg
quelle
13
Wenn mehrere Datenbanken vorhanden sind, fügen Sie auch eine Zeile WHERE TABLE_SCHEMA = "" hinzu.
John Millikin
1
Danke John, wie wird die Abfrage, wenn ich Tabellennamen mit Spalte A und Spalte B abrufen muss?
Jobi Joy
1
@JohnMillikin: oder umgekehrt, wenn Sie die Datenbank nicht kennen, sondern nur den Feldnamen, lassen Sie ihn weg und fügen Sie ihn TABLE_SCHEMAzu den Feldern des Rückgabesatzes hinzu, um alle Datenbanken + Tabellen anzuzeigen, die diesen Spaltennamen enthalten.
Abel
Sollte das nicht auch lauten: wie '% wild%' oder = 'wild' statt wie 'wild'?
Onkel Iroh
1
Ich habe es gerade versucht, aber alle Ergebnisse festgestellt, die ich für Objekte erhalten habe, die bei der Abfrage nicht angezeigt werden show tables;. Kann jemand erklären, warum dies der Fall sein könnte?
wdkrnls
46

Einfacher in einer SQL-Zeile erledigt:

SELECT * FROM information_schema.columns WHERE column_name = 'column_name';
Xman Klassik
quelle
Gibt es irgendwelche Nachteile bei der Verwendung von * hier?
Guney Ozsan
38
SELECT DISTINCT TABLE_NAME, COLUMN_NAME  
FROM INFORMATION_SCHEMA.COLUMNS  
WHERE column_name LIKE 'employee%'  
AND TABLE_SCHEMA='YourDatabase'
Baycaysoi
quelle
19

In Versionen, die keine haben information_schema(ältere Versionen oder einige ndbs), können Sie die Tabellenstruktur sichern und die Spalte manuell durchsuchen.

mysqldump -h$host -u$user -p$pass --compact --no-data --all-databases > some_file.sql

Suchen Sie nun den Spaltennamen some_file.sqlmit Ihrem bevorzugten Texteditor oder verwenden Sie einige raffinierte awk-Skripte.


Und ein einfaches sed-Skript, um die Spalte zu finden, ersetzen Sie einfach COLUMN_NAME durch Ihre:

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 den Dump direkt in sed leiten, aber das ist trivial.

Radu Maris
quelle
12

Für diejenigen, die nach der Umkehrung davon suchen, dh nach Tabellen suchen, die keinen bestimmten Spaltennamen enthalten, ist hier 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');

Dies war sehr praktisch, als wir langsam die Verwendung der speziellen ai_colSpalte von InnoDB implementierten und herausfinden mussten, welche unserer 200 Tabellen noch aktualisiert werden mussten.

oucil
quelle
8

Wenn Sie " Nur alle Tabellen abrufen " möchten , verwenden Sie diese Abfrage:

SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME like '%'
and TABLE_SCHEMA = 'tresbu_lk'

Wenn Sie " Alle Tabellen mit Spalten abrufen " möchten , verwenden Sie diese Abfrage:

SELECT DISTINCT TABLE_NAME, COLUMN_NAME  
FROM INFORMATION_SCHEMA.COLUMNS  
WHERE column_name LIKE '%'  
AND TABLE_SCHEMA='tresbu_lk'
Shivendra Prakash Shukla
quelle
6

Verwenden Sie diese einzeilige Abfrage und ersetzen Sie den gewünschten Spaltennamen durch Ihren Spaltennamen.

SELECT TABLE_NAME FROM information_schema.columns WHERE column_name = 'desired_column_name';
António Delgado
quelle
4
SELECT DISTINCT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE '%city_id%' AND TABLE_SCHEMA='database'
Nageen Nayak
quelle
2

Das Problem mit information_schema ist, dass es furchtbar langsam sein kann. Die Verwendung der SHOW-Befehle ist schneller.

Nachdem Sie die Datenbank ausgewählt haben, senden Sie zuerst die Abfrage SHOW TABLES. Und dann machen Sie SHOW COLUMNS für jede der Tabellen.

In PHP würde das ungefähr so ​​aussehen

    $ 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)
               ....
        }}
    }}

user2587656
quelle
0
select distinct table_name 
from information_schema.columns 
where column_name in ('ColumnA') 
and table_schema='YourDatabase';
and table_name in 
(
 select distinct table_name 
 from information_schema.columns 
 where column_name in ('ColumnB')
 and table_schema='YourDatabase';
);

Das ^^ erhält die Tabellen mit ColumnA AND ColumnB anstelle von ColumnA OR ColumnB wie die akzeptierte Antwort

love2code
quelle