Bagaimana menemukan semua tabel di MySQL dengan nama kolom spesifik di dalamnya?

Jawaban:

1397

Untuk mendapatkan semua tabel dengan kolom columnAatau ColumnBdalam database YourDatabase:

SELECT DISTINCT TABLE_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME IN ('columnA','ColumnB')
        AND TABLE_SCHEMA='YourDatabase';
Ken
sumber
6
@Echo - Anda selalu dapat bermain dengan mysqldump dengan --skip-extended-insert dan kemudian melihat-lihat file ... kotor tapi anehnya memuaskan :)
Ken
1
@ Echo, untuk versi sebelum 5 membuang struktur ke file menggunakan mysqldump, lihat jawaban saya.
Radu Maris
8
Anda juga dapat menggunakan DATABASE()alih-alih string untuk mencari di database yang saat ini dipilih.
Sherlock
1
@ Ken: apakah ada cara untuk menambahkan satu filter lagi ke permintaan Anda? Memang, memilih tabel di mana de columnA memiliki nilai tertentu.
Fred FLECHE
2
@FredFLECHE Saya pikir pada tahap itu saya hanya akan loop melalui mereka dalam naskah dan tetap sederhana
Ken
176
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%wild%';
GSerg
sumber
13
Jika ada banyak basis data, tambahkan baris WHERE TABLE_SCHEMA = "" juga.
John Millikin
1
Terima kasih John, bagaimana kueri jika saya perlu mendapatkan nama Tabel yang memiliki columnA dan ColumnB hadir?
Jobi Joy
1
@JohnMillikin: atau sebaliknya, jika Anda tidak tahu database tetapi hanya nama bidang, tinggalkan saja dan tambahkan TABLE_SCHEMAke bidang pengembalian diatur untuk melihat semua database + tabel yang berisi nama kolom itu.
Abel
Bukankah seharusnya itu berbunyi: seperti '% wild%' atau = 'wild' daripada like 'wild'?
Paman Iroh
1
Saya baru saja mencoba ini tetapi memperhatikan semua hasil yang saya dapatkan di mana untuk objek yang tidak muncul dengan kueri show tables;. Adakah yang bisa menjelaskan mengapa ini bisa terjadi?
wdkrnls
46

Lebih sederhana dilakukan dalam satu baris SQL:

SELECT * FROM information_schema.columns WHERE column_name = 'column_name';
Xman Klasik
sumber
Apakah ada kerugian menggunakan * di sini?
Guney Ozsan
38
SELECT DISTINCT TABLE_NAME, COLUMN_NAME  
FROM INFORMATION_SCHEMA.COLUMNS  
WHERE column_name LIKE 'employee%'  
AND TABLE_SCHEMA='YourDatabase'
baycaysoi
sumber
19

Dalam versi yang tidak memiliki information_schema(versi yang lebih lama, atau beberapa ndb), Anda dapat membuang struktur tabel dan mencari kolom secara manual.

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

Sekarang cari nama kolom some_file.sqlmenggunakan editor teks pilihan Anda, atau gunakan beberapa script awk bagus.


Dan skrip sed sederhana untuk menemukan kolom, cukup ganti COLUMN_NAME dengan milik Anda:

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,

Anda dapat menyalurkan dump langsung ke sed tetapi itu sepele.

Radu Maris
sumber
12

Bagi mereka yang mencari kebalikan dari ini, yaitu mencari tabel yang tidak mengandung nama kolom tertentu, berikut adalah kueri ...

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

Ini sangat berguna ketika kami mulai menerapkan penggunaan ai_colkolom khusus InnoDB secara perlahan dan perlu mencari tahu dari 200 tabel kami mana yang belum ditingkatkan.

oucil
sumber
8

Jika Anda ingin "Hanya mendapatkan semua tabel ", Kemudian gunakan kueri ini:

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

Jika Anda ingin " Untuk mendapatkan semua tabel dengan Kolom ", Kemudian gunakan kueri ini:

SELECT DISTINCT TABLE_NAME, COLUMN_NAME  
FROM INFORMATION_SCHEMA.COLUMNS  
WHERE column_name LIKE '%'  
AND TABLE_SCHEMA='tresbu_lk'
Shivendra Prakash Shukla
sumber
6

Gunakan kueri satu baris ini, ganti nama_kolom yang diinginkan dengan nama kolom Anda.

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

Masalah dengan information_schema adalah bisa sangat lambat. Lebih cepat menggunakan perintah SHOW.

Setelah Anda memilih basis data, Anda terlebih dahulu mengirim kueri SHOW TABLES. Dan kemudian Anda melakukan SHOW COLUMNS untuk masing-masing tabel.

Dalam PHP itu akan terlihat seperti

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

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

Itu ^^ akan mendapatkan tabel dengan ColumnA DAN ColumnB bukan ColumnA ATAU ColumnB seperti jawaban yang diterima

kode love2
sumber