Domanda

Ho 2-3 nomi di colonne differenti che voglio cercare nell'intero DB ed elencare tutte le tabelle che hanno quelle colonne. Qualche semplice script?

È stato utile?

Soluzione

Per ottenere tutte le tabelle con colonne colonna A o ColumnB nel database YourDatabase :

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

Altri suggerimenti

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

Più semplicemente fatto in una riga di SQL:

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'

Nella versione che non ha information_schema (versioni precedenti o alcuni ndb) puoi scaricare la struttura della tabella e cercare manualmente la colonna.

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

Ora cerca il nome della colonna in some_file.sql usando il tuo editor di testo preferito o usa alcuni script awk eleganti.


E un semplice script sed per trovare la colonna, basta sostituire COLUMN_NAME con il tuo:

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,

Puoi convogliare il dump direttamente in sed ma è banale.

Per coloro che cercano il contrario di questo, cioè cercando tabelle che non contengono un determinato nome di colonna, ecco la query ...

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');

Questo è stato molto utile quando abbiamo iniziato a implementare lentamente l'uso della speciale colonna ai_col di InnoDB e dovevamo capire quale delle nostre 200 tabelle non fosse ancora stata aggiornata.

Se vuoi " Per ottenere solo tutte le tabelle " ;, quindi usa questa query:

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

Se vuoi " Per ottenere tutte le tabelle con colonne " ;, quindi usa questa query:

SELECT DISTINCT TABLE_NAME, COLUMN_NAME  
FROM INFORMATION_SCHEMA.COLUMNS  
WHERE column_name LIKE '%'  
AND TABLE_SCHEMA='tresbu_lk'

Utilizza questa query a una riga, sostituisci auspicato nome_colonna con il nome della tua colonna.

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'

Il problema con information_schema è che può essere terribilmente lento. È più veloce usare i comandi SHOW.

Dopo aver selezionato il database, devi prima inviare la query SHOW TABLES. E poi MOSTRA COLONNE per ciascuna delle tabelle.

In PHP sarebbe simile a

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top