Come trovare tutte le tabelle in MySQL con nomi di colonne specifici in esse?


Risposte:


1397

Per ottenere tutte le tabelle con colonne columnAo ColumnBnel database YourDatabase:

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

6
@Echo - puoi sempre giocare con mysqldump con --skip-extended-insert e quindi passare in rassegna il file ... sporco ma stranamente satificante :)
Ken

1
@Echo, per le versioni precedenti alla 5 scaricare la struttura su file usando mysqldump, vedere la mia risposta.
Radu Maris,

8
È inoltre possibile utilizzare DATABASE()invece di una stringa per cercare nel database attualmente selezionato.
Sherlock,

1
@Ken: c'è un modo per aggiungere un altro filtro alla tua query? In effetti, selezionando le tabelle in cui de columnA ha un valore specifico.
Fred FLECHE,

2
@FredFLECHE Penso che a quel punto li avrei semplicemente fatti scorrere in una sceneggiatura e ne sarei stato semplice
Ken

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

13
Se sono presenti più database, aggiungere anche una riga WHERE TABLE_SCHEMA = "".
John Millikin,

1
Grazie John, come sarà la domanda se devo ottenere i nomi delle tabelle che presentano columnA e ColumnB?
Jobi Joy,

1
@JohnMillikin: o viceversa, se non conosci il database ma solo il nome del campo, lascialo fuori e aggiungi TABLE_SCHEMAai campi del set di ritorno per vedere tutti i database + le tabelle che contengono quel nome di colonna.
Abele,

Non dovrebbe leggerlo neanche: like '% wild%' o = 'wild' invece di like 'wild'?
Zio Iroh,

1
Ho appena provato questo, ma ho notato tutti i risultati ottenuti per gli oggetti che non vengono visualizzati con la query show tables;. Qualcuno può spiegare perché questo potrebbe essere il caso?
wdkrnls,

46

Più semplicemente fatto in una riga di SQL:

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

Ci sono degli svantaggi nell'utilizzare * qui?
Guney Ozsan,

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

19

Nella versione che non ha information_schema(versioni precedenti o alcuni ndb) è possibile 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 some_file.sqlusando 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 la discarica direttamente in sed ma è banale.


12

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 ai_colcolonna speciale di InnoDB e dovevamo capire quale delle nostre 200 tabelle non fosse ancora stata aggiornata.


8

Se si desidera " Per ottenere solo tutte le tabelle ", utilizzare questa query:

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

Se si desidera " Per ottenere tutte le tabelle con colonne ", utilizzare questa query:

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

6

Utilizzare questa query di una riga, sostituire il nome_colonna desiderato con il nome della colonna.

SELECT TABLE_NAME FROM information_schema.columns WHERE column_name = 'desired_column_name';

4
SELECT DISTINCT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE '%city_id%' AND TABLE_SCHEMA='database'

2

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 fai MOSTRA COLONNE per ciascuna delle tabelle.

In PHP sarebbe simile

    $ res = mysqli_query ("MOSTRA TAVOLI");
    while ($ row = mysqli_fetch_array ($ res))
    {$ rs2 = mysqli_query ("MOSTRA COLONNE DA". $ row [0]);
        while ($ rw2 = mysqli_fetch_array ($ rs2))
        {if ($ rw2 [0] == $ target)
               ....
        }
    }


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

Che ^^ otterrà le tabelle con ColumnA AND ColumnB invece di ColumnA OR ColumnB come la risposta accettata

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.