web-dev-qa-db-fra.com

Comment trouver toutes les tables dans MySQL avec des noms de colonnes spécifiques?

Je souhaite rechercher dans la base de données entière deux ou trois noms de colonne différents et répertorier toutes les tables contenant ces colonnes. Un script facile?

784
Jobi Joy

Pour obtenir toutes les tables avec les colonnes columnA ou ColumnB dans la base de données YourDatabase:

SELECT DISTINCT TABLE_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME IN ('columnA','ColumnB')
        AND TABLE_SCHEMA='YourDatabase';
1275
Ken
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%wild%';
159
GSerg

Plus simplement dans une ligne de SQL:

SELECT * FROM information_schema.columns WHERE column_name = 'column_name';
42
Xman Classical
SELECT DISTINCT TABLE_NAME, COLUMN_NAME  
FROM INFORMATION_SCHEMA.COLUMNS  
WHERE column_name LIKE 'employee%'  
AND TABLE_SCHEMA='YourDatabase'
35
baycaysoi

Dans les versions qui n'ont pas information_schema (versions antérieures ou certaines ndb), vous pouvez vider la structure du tableau et rechercher la colonne manuellement.

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

Maintenant, recherchez le nom de la colonne dans some_file.sql en utilisant votre éditeur de texte préféré, ou utilisez des scripts astucieux awk.


Et un simple script sed pour trouver la colonne, remplacez simplement COLUMN_NAME par le votre:

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,

Vous pouvez diriger le vidage directement dans sed, mais c'est trivial.

18
Radu Maris

Pour ceux qui recherchent l'inverse, c'est-à-dire des tables qui ne contiennent pas un certain nom de colonne, voici la requête ...

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

Cela s'est avéré très utile lorsque nous avons commencé à utiliser progressivement la colonne spéciale ai_col de InnoDB et que nous devions déterminer laquelle de nos 200 tables n'avait pas encore été mise à jour.

11
oucil

Si vous voulez "Pour obtenir toutes les tables uniquement", utilisez cette requête:

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

Si vous voulez "Pour obtenir toutes les tables avec des colonnes", utilisez cette requête:

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

Utilisez cette requête sur une ligne, remplacez le nom de colonne désiré par votre nom de colonne.

SELECT TABLE_NAME FROM information_schema.columns WHERE column_name = 'desired_column_name';
4
António Delgado
SELECT DISTINCT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE '%city_id%' AND TABLE_SCHEMA='database'
3
nageen nayak

Le problème avec information_schema est que cela peut être terriblement lent. Il est plus rapide d’utiliser les commandes SHOW.

Après avoir sélectionné la base de données, vous envoyez d’abord la requête SHOW TABLES. Et ensuite, vous affichez les colonnes pour chacune des tables.

Dans PHP, cela ressemblerait à quelque chose comme

 
 $ res = mysqli_query ("SHOW TABLES"); 
 tant que ($ row = mysqli_fetch_array ($ res)) 
 {$ rs2 = mysqli_query ("SHOW COLUMNS FROM ". $ Row [0]); 
 While ($ rw2 = mysqli_fetch_array ($ rs2)) 
 {If ($ rw2 [0] == $ target) 
 .... 
} 
} 
 
1
user2587656