Réponses:
Pour obtenir toutes les tables avec des 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';
DATABASE()
au lieu d'une chaîne pour rechercher dans la base de données actuellement sélectionnée.
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%wild%';
TABLE_SCHEMA
aux champs de l'ensemble de retour pour voir toutes les bases de données + tables qui contiennent ce nom de colonne.
show tables;
. Quelqu'un peut-il expliquer pourquoi cela pourrait être le cas?
Plus simplement fait dans une seule ligne de SQL:
SELECT * FROM information_schema.columns WHERE column_name = 'column_name';
Dans les versions qui n'en ont pas information_schema
(anciennes versions ou certaines ndb), vous pouvez vider la structure de la table et rechercher la colonne manuellement.
mysqldump -h$host -u$user -p$pass --compact --no-data --all-databases > some_file.sql
Recherchez maintenant le nom de la colonne en some_file.sql
utilisant votre éditeur de texte préféré, ou utilisez des scripts awk astucieux.
Et un simple script sed pour trouver la colonne, remplacez simplement COLUMN_NAME par le vôtre:
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.
Pour ceux qui recherchent l'inverse de cela, c'est-à-dire qui recherchent 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 ai_col
avéré très pratique lorsque nous avons commencé à implémenter lentement l'utilisation de la colonne spéciale d'InnoDB et que nous devions déterminer laquelle de nos 200 tables n'avait pas encore été mise à niveau.
Si vous voulez " Pour obtenir toutes les tables uniquement ", utilisez alors 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 alors cette requête:
SELECT DISTINCT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE column_name LIKE '%'
AND TABLE_SCHEMA='tresbu_lk'
Utilisez cette requête d'une ligne, remplacez le nom_colonne_désiré par votre nom de colonne.
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'
Le problème avec information_schema est qu'il 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 puis vous affichez les colonnes pour chacune des tables.
En PHP, cela ressemblerait à quelque chose comme
$ res = mysqli_query ("AFFICHER LES 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) .... } }
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';
);
Que ^^ obtiendra les tables avec ColonneA ET ColonneB au lieu de ColonneA OU ColonneB comme la réponse acceptée