Jak znaleźć wszystkie tabele w MySQL z określonymi nazwami kolumn?

Odpowiedzi:

1396

Aby uzyskać wszystkie tabele z kolumnami columnAlub ColumnBw bazie danych YourDatabase:

SELECT DISTINCT TABLE_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME IN ('columnA','ColumnB')
        AND TABLE_SCHEMA='YourDatabase';
Rozpoznać
źródło
6
@Echo - zawsze możesz grać z mysqldump z --skip-extended-insert, a następnie grep przez plik ... brudny, ale dziwnie sycący :)
Ken
1
@Echo, w przypadku wersji wcześniejszych niż 5 zrzuć strukturę do pliku przy użyciu mysqldump, zobacz moją odpowiedź.
Radu Maris,
8
Możesz także użyć DATABASE()zamiast ciągu znaków do wyszukiwania w aktualnie wybranej bazie danych.
Sherlock,
1
@Ken: czy istnieje sposób, aby dodać jeszcze jeden filtr do zapytania? Rzeczywiście, wybierając tabele, w których de columnA ma określoną wartość.
Fred FLECHE
2
@FredFLECHE Myślę, że na tym etapie po prostu przejrzałbym je w skrypcie i upraszczając
Ken
176
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%wild%';
GSerg
źródło
13
Jeśli istnieje wiele baz danych, dodaj również wiersz WHERE TABLE_SCHEMA = "".
John Millikin,
1
Dzięki John, w jaki sposób zapytanie będzie wymagało uzyskania nazw tabel zawierających kolumny A i kolumny B?
Jobi Joy,
1
@JohnMillikin: lub odwrotnie, jeśli nie znasz bazy danych, a jedynie nazwę pola, pomiń ją i dodaj TABLE_SCHEMAdo pól zestawu zwrotnego, aby wyświetlić wszystkie bazy danych + tabele zawierające tę kolumnę.
Abel
Czy nie powinno to brzmieć: jak „% wild%” lub = „wild” zamiast jak „wild”?
Wujek Iroh
1
Właśnie próbowałem tego, ale zauważyłem wszystkie wyniki, które otrzymałem dla obiektów, które nie pokazują się w zapytaniu show tables;. Czy ktoś może wyjaśnić, dlaczego tak się dzieje?
wdkrnls
46

Po prostu zrobione w jednym wierszu SQL:

SELECT * FROM information_schema.columns WHERE column_name = 'column_name';
Xman Classical
źródło
Czy są jakieś wady korzystania z * tutaj?
Guney Ozsan,
38
SELECT DISTINCT TABLE_NAME, COLUMN_NAME  
FROM INFORMATION_SCHEMA.COLUMNS  
WHERE column_name LIKE 'employee%'  
AND TABLE_SCHEMA='YourDatabase'
baycaysoi
źródło
19

W wersji, która nie ma information_schema(starszych wersji lub niektórych ndb), możesz zrzucić strukturę tabeli i ręcznie przeszukać kolumnę.

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

Teraz wyszukaj nazwę kolumny some_file.sqlza pomocą preferowanego edytora tekstów lub użyj sprytnych skryptów awk.


I prosty skrypt sed, aby znaleźć kolumnę, wystarczy zastąpić COLUMN_NAME swoim:

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,

Możesz przesłać zrzut bezpośrednio do sed, ale to banalne.

Radu Maris
źródło
12

Dla tych, którzy szukają odwrotności tego, tj. Szukają tabel, które nie zawierają określonej nazwy kolumny, oto zapytanie ...

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

Przydało się to naprawdę, gdy zaczęliśmy powoli wdrażać specjalną ai_colkolumnę InnoDB i potrzebowaliśmy dowiedzieć się, który z naszych 200 tabel wymagał jeszcze aktualizacji.

oucil
źródło
8

Jeśli chcesz „ Aby uzyskać tylko wszystkie tabele ”, użyj tego zapytania:

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

Jeśli chcesz „ Aby uzyskać wszystkie tabele z kolumnami ”, użyj tego zapytania:

SELECT DISTINCT TABLE_NAME, COLUMN_NAME  
FROM INFORMATION_SCHEMA.COLUMNS  
WHERE column_name LIKE '%'  
AND TABLE_SCHEMA='tresbu_lk'
Shivendra Prakash Shukla
źródło
6

Użyj tego jednowierszowego zapytania, zamień żądaną nazwę_kolumny na nazwę kolumny.

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

Problem z Information_schema polega na tym, że może być strasznie powolny. Szybciej jest używać poleceń POKAŻ.

Po wybraniu bazy danych najpierw wysyłasz zapytanie POKAŻ TABELE. A potem robisz POKAŻ KOLUMNY dla każdego ze stolików.

W PHP wyglądałoby to mniej więcej tak

    $ res = mysqli_query („SHOW TABLES”);
    while ($ row = mysqli_fetch_array ($ res))
    {$ rs2 = mysqli_query („POKAŻ KOLUMNY OD”. $ wiersz [0]);
        while ($ rw2 = mysqli_fetch_array ($ rs2))
        {if ($ rw2 [0] == $ target)
               …
        }
    }

użytkownik2587656
źródło
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';
);

To ^^ otrzyma tabele z Kolumną A ORAZ Kolumną B zamiast Kolumny A LUB Kolumny B, podobnie jak zaakceptowana odpowiedź

love2code
źródło