У мене є 2-3 різних імен стовпців, які я хочу шукати у всій БД і перераховувати всі таблиці, у яких є ці стовпці. Будь-який простий сценарій?
У мене є 2-3 різних імен стовпців, які я хочу шукати у всій БД і перераховувати всі таблиці, у яких є ці стовпці. Будь-який простий сценарій?
Відповіді:
Щоб отримати всі таблиці зі стовпцями columnA
або ColumnB
в базі даних YourDatabase
:
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('columnA','ColumnB')
AND TABLE_SCHEMA='YourDatabase';
DATABASE()
замість рядка для пошуку в поточно вибраній базі даних.
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%wild%';
TABLE_SCHEMA
до полів повернення, щоб побачити всі бази даних + таблиці, що містять це ім'я стовпця.
show tables;
. Хтось може пояснити, чому це може бути так?
Простіше зробити в одному рядку SQL:
SELECT * FROM information_schema.columns WHERE column_name = 'column_name';
У версії, яка не має 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, але це банально.
Для тих, хто шукає зворотне значення цього, тобто шукає таблиці, які не містять певної назви стовпців, ось запит ...
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 таблиць ще потрібно оновити.
Якщо ви хочете " Отримати лише всі таблиці ", то використовуйте цей запит:
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'
Скористайтеся цим запитом на один рядок, замініть ім'я потрібної колонці на ім’я стовпця.
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'
Проблема з інформаційною схемою полягає в тому, що це може бути дуже повільно. Швидше використовувати команди 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] == $ ціль) …. } }
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, як прийнята відповідь