Як знайти всі таблиці в MySQL з конкретними назвами стовпців у них?


Відповіді:


1396

Щоб отримати всі таблиці зі стовпцями columnAабо ColumnBв базі даних YourDatabase:

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

6
@Echo - ви завжди можете грати з mysqldump з --skip-Extended-insert, а потім проскакуйте через файл ... брудно, але дивно ситно :)
Ken

1
@Echo, для версій до 5 скидання структури для подання файлів за допомогою mysqldump дивіться мою відповідь.
Раду Маріс

8
Ви також можете використовувати DATABASE()замість рядка для пошуку в поточно вибраній базі даних.
Шерлок

1
@Ken: чи є спосіб додати ще один фільтр до запиту? Дійсно, вибір таблиць, де de columnA має конкретне значення.
Фред ФЛЕХЕ

2
@FredFLECHE Я думаю, що на цьому етапі я б просто переглянув їх у сценарії і все було просто
Кен

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

13
Якщо існує декілька баз даних, додайте також рядок WHERE TABLE_SCHEMA = "".
Джон Міллікін

1
Дякую, Джон, як буде запит, якщо мені потрібно отримати імена таблиці, в яких є колонкаA та стовпецьB?
Джобі Джой

1
@JohnMillikin: або, навпаки, якщо ви не знаєте базу даних, а лише ім'я поля, залиште її та додайте TABLE_SCHEMAдо полів повернення, щоб побачити всі бази даних + таблиці, що містять це ім'я стовпця.
Авель

Чи не слід це читати: як "% wild%" або = "wild" замість "wild"?
Дядько Ірох

1
Я просто спробував це, але помітив усі результати, які я отримав десь для об’єктів, які не відображаються із запитом show tables;. Хтось може пояснити, чому це може бути так?
wdkrnls

46

Простіше зробити в одному рядку SQL:

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

Чи є недоліки використання * тут?
Guney Ozsan

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

19

У версії, яка не має information_schema(старіші версії або деякі ndb), ви можете скидати структуру таблиці та шукати стовпчик вручну.

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

Тепер шукайте ім'я стовпця за some_file.sqlдопомогою вподобаного редактора тексту або використовуйте кілька чудових сценаріїв awk.


І простий скрипт sed, щоб знайти стовпець, просто замініть COLUMN_NAME на ваш:

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,

Ви можете подати звалище прямо в sed, але це банально.


12

Для тих, хто шукає зворотне значення цього, тобто шукає таблиці, які не містять певної назви стовпців, ось запит ...

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

Це було дуже зручно, коли ми почали повільно реалізовувати використання спеціального ai_colстовпчика InnoDB, і нам потрібно було з’ясувати, яку з наших 200 таблиць ще потрібно оновити.


8

Якщо ви хочете " Отримати лише всі таблиці ", то використовуйте цей запит:

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

Якщо ви хочете " Отримати всі таблиці зі стовпцями ", тоді використовуйте цей запит:

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

6

Скористайтеся цим запитом на один рядок, замініть ім'я потрібної колонці на ім’я стовпця.

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

Проблема з інформаційною схемою полягає в тому, що це може бути дуже повільно. Швидше використовувати команди SHOW.

Після вибору бази даних ви спочатку надсилаєте запит ПОКАЗНИТЬ ТАБЛИЦІ. І тоді ви РОЗКАЖУЙТЕ КОЛОНІ для кожної з таблиць.

У PHP це могло б виглядати приблизно так

    $ res = mysqli_query ("ПОКАЗАТИ ТАБЛИЦІ");
    while ($ row = mysqli_fetch_array ($ res))
    {$ rs2 = mysqli_query ("ПОКАЗНИТИ КОЛИНИ З". $ row [0]);
        while ($ rw2 = mysqli_fetch_array ($ rs2))
        {if ($ rw2 [0] == $ ціль)
               ….
        }
    }


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

Цей ^^ отримає таблиці зі стовпцем A і стовпцемB замість стовпцяA або стовпцяB, як прийнята відповідь

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.