Làm thế nào để tìm tất cả các bảng trong MySQL với các tên cột cụ thể trong đó?


Câu trả lời:


1397

Để có được tất cả các bảng có cột columnAhoặc ColumnBtrong cơ sở dữ liệu YourDatabase:

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

6
@Echo - bạn luôn có thể chơi với mysqldump với --skip-extend-insert và sau đó grep qua tệp ... bẩn nhưng bão hòa lạ lùng :)
Ken

1
@Echo, đối với các phiên bản trước 5 kết xuất cấu trúc thành tệp bằng mysqldump, hãy xem câu trả lời của tôi.
Radu Maris

8
Bạn cũng có thể sử dụng DATABASE()thay vì một chuỗi để tìm kiếm trong cơ sở dữ liệu hiện được chọn.
Sherlock

1
@Ken: có cách nào để thêm một bộ lọc vào truy vấn của bạn không? Thật vậy, chọn các bảng trong đó de cộtA có một giá trị cụ thể.
Fred FLECHE

2
@FredFLECHE Tôi nghĩ ở giai đoạn đó tôi sẽ chỉ lặp lại chúng trong một kịch bản và giữ cho nó đơn giản
Ken

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

13
Nếu có nhiều cơ sở dữ liệu, hãy thêm một dòng WHERE TABLE_SCHema = "".
John Millikin

1
Cảm ơn John, làm thế nào để truy vấn nếu tôi cần lấy tên Bảng có cộtA và CộtB?
Jobi Joy

1
@JohnMillikin: hoặc ngược lại, nếu bạn không biết cơ sở dữ liệu mà chỉ biết tên trường, hãy bỏ nó và thêm TABLE_SCHEMAvào các trường của bộ trả về để xem tất cả các cơ sở dữ liệu + bảng có chứa tên cột đó.
Abel

Không nên đọc một trong hai: như '% wild%' hoặc = 'wild' thay vì like 'wild'?
Chú Iroh

1
Tôi chỉ thử điều này nhưng nhận thấy tất cả các kết quả tôi nhận được ở đâu cho các đối tượng không hiển thị với truy vấn show tables;. Bất cứ ai có thể giải thích tại sao điều này có thể là trường hợp?
wdkrnls

46

Đơn giản hơn được thực hiện trong một dòng SQL:

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

Có bất kỳ nhược điểm của việc sử dụng * ở đây?
Guney Ozsan

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

19

Trong phiên bản không có information_schema(phiên bản cũ hơn hoặc một số ndb), bạn có thể kết xuất cấu trúc bảng và tìm kiếm cột theo cách thủ công.

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

Bây giờ hãy tìm kiếm tên cột some_file.sqlbằng cách sử dụng trình soạn thảo văn bản ưa thích của bạn hoặc sử dụng một số tập lệnh awk tiện lợi.


Và một tập lệnh sed đơn giản để tìm cột, chỉ cần thay thế COLUMN_NAME bằng của bạn:

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,

Bạn có thể đổ ống trực tiếp vào sed nhưng điều đó không quan trọng.


12

Đối với những người tìm kiếm nghịch đảo của điều này, tức là tìm kiếm các bảng không chứa một tên cột nhất định, đây là truy vấn ...

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

Điều này thực sự hữu ích khi chúng tôi bắt đầu triển khai từ từ việc sử dụng ai_colcột đặc biệt của InnoDB và cần phải tìm ra trong số 200 bảng của chúng tôi chưa được nâng cấp.


8

Nếu bạn muốn " Để chỉ lấy tất cả các bảng ", thì hãy sử dụng truy vấn này:

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

Nếu bạn muốn " Để lấy tất cả các bảng có Cột ", thì hãy sử dụng truy vấn này:

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

6

Sử dụng truy vấn một dòng này, thay thế mong muốn_column_name bằng tên cột của bạn.

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

Vấn đề với information_schema là nó có thể rất chậm. Nó nhanh hơn để sử dụng các lệnh SHOW.

Sau khi bạn chọn cơ sở dữ liệu, trước tiên bạn gửi truy vấn HIỂN THỊ BẢNG. Và sau đó bạn thực hiện SHOW COLUMNS cho mỗi bảng.

Trong PHP sẽ trông giống như

    $ res = mysqli_query ("HIỂN THỊ BẢNG");
    trong khi ($ row = mysqli_fetch_array ($ res))
    {$ rs2 = mysqli_query ("HIỂN THỊ MÀU SẮC TỪ". $ row [0]);
        trong khi ($ rw2 = mysqli_fetch_array ($ rs2))
        {if ($ rw2 [0] == $ mục tiêu)
               ....
        }
    }


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

Điều đó ^^ sẽ nhận được các bảng với CộtA VÀ CộtB thay vì CộtA HOẶC CộtB như câu trả lời được chấp nhận

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.