특정 열 이름을 가진 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-항상 --skip-extended-insert로 mysqldump로 플레이 한 다음 파일을 통해 grep 할 수 있습니다. 더럽지 만 이상하게 satifying :)
Ken

1
@Echo, 5 이전 버전의 경우 mysqldump를 사용하여 구조를 파일로 덤프하려면 내 대답을 참조하십시오.
Radu Maris

8
DATABASE()문자열 대신 사용 하여 현재 선택된 데이터베이스를 검색 할 수도 있습니다 .
Sherlock

1
@ Ken : 쿼리에 필터를 하나 더 추가하는 방법이 있습니까? 실제로 de columnA에 특정 값이있는 테이블을 선택하십시오.
Fred FLECHE

2
@FredFLECHE 나는 그 단계에서 스크립트로 그것들을 반복하고 간단하게 유지할 것이라고 생각합니다.
Ken

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

13
데이터베이스가 여러 개인 경우 WHERE TABLE_SCHEMA = ""행도 추가하십시오.
John Millikin

1
John에게 감사합니다. columnA와 ColumnB가있는 테이블 이름을 가져와야하는 경우 쿼리는 어떻게됩니까?
Jobi Joy

1
@JohnMillikin : 또는 데이터베이스를 모르지만 필드 이름 만 알고있는 경우 데이터베이스를 그대로두고 TABLE_SCHEMA반환 열의 필드에 추가 하여 해당 열 이름이 포함 된 모든 데이터베이스 + 테이블을 봅니다.
Abel

'wild'대신 '% wild %'또는 = 'wild'과 같이 읽지 않아야합니까?
삼촌 Iroh

1
방금 이것을 시도했지만 query와 함께 표시되지 않는 객체에 대한 모든 결과를 발견했습니다 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');

이것은 InnoDB의 특수 ai_col컬럼 사용을 천천히 구현하기 시작했을 때 매우 유용 했으며 아직 업그레이드되지 않은 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

이 한 줄 쿼리를 사용하고 desired_column_name을 열 이름으로 바꿉니다.

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

information_schema의 문제점은 매우 느릴 수 있다는 것입니다. SHOW 명령을 사용하는 것이 더 빠릅니다.

데이터베이스를 선택한 후 먼저 SHOW TABLES 쿼리를 보냅니다. 그런 다음 각 테이블에 대해 SHOW COLUMNS를 수행하십시오.

PHP에서 다음과 같이 보일 것입니다

    $ res = mysqli_query ( "쇼 테이블");
    while ($ row = mysqli_fetch_array ($ res))
    {$ rs2 = mysqli_query ( "SHOW COLUMNS FROM". $ row [0]);
        while ($ rw2 = mysqli_fetch_array ($ rs2))
        {if ($ rw2 [0] == $ target)
               ....
        }
    }


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

^^ 허용 된 답변과 같이 ColumnA OR ColumnB 대신 ColumnA AND ColumnB가있는 테이블을 가져옵니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.