MySQL'deki tüm tabloları belirli sütun adlarıyla nasıl bulabilirim?


852

Ben tüm DB bakmak ve bu sütunları olan tüm tabloları listelemek istiyorum 2-3 farklı sütun adları var. Kolay bir senaryo var mı?


Yanıtlar:


1396

Sütunlarla columnAveya ColumnBveritabanındaki tüm tabloları almak için YourDatabase:

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

6
@Echo - her zaman --skip-extended-insert ile mysqldump ile oynayabilir ve daha sonra dosyada grep ... kirli ama garip doyurucu :)
Ken

1
@Echo, 5'ten önceki sürümler için yapıyı mysqldump kullanarak dosyaya dök, cevabımı gör.
Radu Maris

8
DATABASE()Seçili veritabanında arama yapmak için dize yerine de kullanabilirsiniz .
Sherlock

1
@Ken: Sorgunuza bir filtre daha eklemenin bir yolu var mı? Gerçekten de de columnA öğesinin belirli bir değere sahip olduğu tabloları seçmek.
Fred FLECHE

2
@FredFLECHE Ben bu aşamada sadece bir senaryoda onları döngü ve basit tutmak düşünüyorum
Ken

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

13
Birden çok veritabanı varsa, bir WHERE TABLE_SCHEMA = "" satırı da ekleyin.
John Millikin

1
Teşekkürler John, mevcut columnA ve ColumnB olan tablo adları almak gerekirse sorgu nasıl olacak?
Jobi Joy

1
@JohnMillikin: veya tersine, veritabanını bilmiyorsanız, ancak yalnızca alan adını, dışarıda bırakın ve TABLE_SCHEMAbu sütun adını içeren tüm veritabanlarını + tabloları görmek için döndürme kümesinin alanlarına ekleyin .
Abel

Bu şu şekilde de okunmamalı mı: 'vahşi' yerine '% wild%' veya = 'wild' gibi mi?
Iroh Amca

1
Ben sadece denedim ama sorgu ile görünmeyen nesneler için nerede var tüm sonuçları fark ettim show tables;. Herkes bunun neden böyle olabileceğini açıklayabilir mi?
wdkrnls

46

Daha basitçe SQL'in bir satırında yapılır:

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

Burada * kullanmanın herhangi bir dezavantajı var mı?
Güney Ozsan

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

19

Sahip olmayan sürümde information_schema(eski sürümler veya bazı ndb'ler) tablo yapısını dökebilir ve sütunu manuel olarak arayabilirsiniz.

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

Şimdi some_file.sqltercih ettiğiniz metin düzenleyicisini kullanarak sütun adını arayın veya bazı şık awk komut dosyaları kullanın.


Ve sütunu bulmak için basit bir sed komut dosyası, COLUMN_NAME yerine sizinki yazı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,

Dökümü doğrudan sed'de borulayabilirsiniz, ancak bu önemsizdir.


12

Bunun tersini arayanlar, yani belirli bir sütun adı içermeyen tablolar arayanlar için, sorgu burada ...

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

Bu, InnoDB'nin özel ai_colsütununu yavaşça uygulamaya başladığımızda ve 200 tablolarımızdan hangisinin henüz yükseltilmesi gerektiğini anlamaya ihtiyaç duyduğumuzda gerçekten kullanışlı oldu .


8

" Yalnızca tüm tabloları almak için " istiyorsanız , bu sorguyu kullanın:

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

" Sütunları olan tüm tabloları almak için " istiyorsanız , Bu sorguyu kullanın:

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

6

Bu tek satırlık sorguyu kullanın, istenen_ sütununu_adı sütun adınızla değiştirin.

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

İnformation_schema ile ilgili sorun, çok yavaş olabilir olmasıdır. SHOW komutlarını kullanmak daha hızlıdır.

Veritabanını seçtikten sonra önce SHOW TABLES sorgusunu gönderirsiniz. Ve sonra her bir tablo için COLUMNS GÖSTER.

PHP'de böyle bir şey

    $ res = mysqli_query ("TABLO GÖSTER");
    while ($ row = mysqli_fetch_array ($ res))
    {$ rs2 = mysqli_query ("COLUMNS from SHOW". $ row [0]);
        ($ rw2 = mysqli_fetch_array ($ rs2))
        {if ($ rw2 [0] == $ hedef)
               ....
        }
    }


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

Bu ^^, kabul edilen cevap gibi ColumnA VEYA ColumnB yerine ColumnA AND ColumnB içeren tabloları alacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.