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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top