1051 Stimmen

Wie kann ich alle Tabellen in MySQL finden, die bestimmte Spaltennamen enthalten?

Ich habe 2-3 verschiedene Spaltennamen, die ich in der gesamten Datenbank nachschlagen und alle Tabellen auflisten möchte, die diese Spalten haben. Gibt es ein einfaches Skript?

1 Stimmen

1693voto

Ken Punkte 73996

Um alle Tabellen mit Spalten zu erhalten columnA ou ColumnB in der Datenbank YourDatabase :

SELECT DISTINCT TABLE_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME IN ('columnA','ColumnB')
        AND TABLE_SCHEMA='YourDatabase';

8 Stimmen

@Echo - Sie können immer mit mysqldump mit --skip-extended-insert spielen und dann durch die Datei grep... schmutzig aber seltsam befriedigend :)

1 Stimmen

@Echo, für Versionen vor 5 wird die Struktur mit mysqldump in eine Datei geschrieben, siehe meine Antwort.

0 Stimmen

@kaii Ich möchte noch eine Frage hinzufügen, wie die Suche einschließlich des PK-Typs abläuft. z.B. folgende Anweisung: where COLUMN_NAME ='<Spaltenname>' und <sollte ein Primärschlüssel sein>

268voto

GSerg Punkte 73326
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%wild%';

20 Stimmen

Wenn es mehrere Datenbanken gibt, fügen Sie auch eine WHERE TABLE_SCHEMA=""-Zeile hinzu.

1 Stimmen

Danke John, wie wird die Abfrage, wenn ich brauche, um Tabellennamen zu erhalten, die SpalteA und SpalteB vorhanden ist?

2 Stimmen

@JohnMillikin: oder umgekehrt, wenn Sie die Datenbank nicht kennen, sondern nur den Feldnamen, lassen Sie ihn weg und fügen Sie TABLE_SCHEMA zu den Feldern des Rückgabesets, um alle Datenbanken und Tabellen zu sehen, die diesen Spaltennamen enthalten.

63voto

Xman Classical Punkte 4791

Einfacher geht es mit einer Zeile SQL:

SELECT * FROM information_schema.columns WHERE column_name = 'column_name';

1 Stimmen

Gibt es Nachteile bei der Verwendung von * hier?

1 Stimmen

@GuneyOzsan der einzige Nachteil besteht darin, mehr Daten als nur den Tabellennamen zu erhalten, wonach der Auftraggeber gefragt hat

42voto

baycaysoi Punkte 419
SELECT DISTINCT TABLE_NAME, COLUMN_NAME  
FROM INFORMATION_SCHEMA.COLUMNS  
WHERE column_name LIKE 'employee%'  
AND TABLE_SCHEMA='YourDatabase'

21voto

Radu Maris Punkte 5428

In älteren MySQL-Versionen oder einigen MySQL NDB Cluster-Versionen, die nicht über information_schema können Sie die Tabellenstruktur ausgeben und die Spalten manuell suchen.

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

Suchen Sie nun den Spaltennamen in some_file.sql mit Ihrem bevorzugten Texteditor, oder verwenden Sie einige raffinierte AWK Skripte.


Und eine einfache sed Skript, um die Spalte zu finden. Einfach ersetzen SPALTEN_NAME mit Ihrem:

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 einfügen, aber das ist trivial.

1 Stimmen

Versionen wovon? MySQL? Was ist eine "ndb"? InnoDB ? Oder etwas anderes? Bitte antworten Sie so weit wie möglich per Bearbeitung (Änderung) Ihrer Antwort , nicht hier in den Kommentaren ( ohne "Bearbeiten:", "Aktualisieren:" oder ähnlich - die Antwort sollte so aussehen, als wäre sie heute geschrieben worden). Zum Beispiel durch einen Link darauf, was eine "ndb" ist.

1 Stimmen

@PeterMortensen Ich schätze Ihre Absichten, aber da es eine 10 Jahre alte Antwort ist, kann ich mich nicht an genaue Versionen oder so erinnern, ich rephrease es und verwenden MySQL NDB Cluster statt einfach ndb, hoffe, es ist jetzt gelöscht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X