จะหาตารางทั้งหมดใน MySQL ที่มีชื่อคอลัมน์เฉพาะได้อย่างไร


852

ฉันมีชื่อคอลัมน์ที่แตกต่างกัน 2-3 รายการที่ฉันต้องการค้นหาในฐานข้อมูลทั้งหมดและแสดงรายการตารางทั้งหมดที่มีคอลัมน์เหล่านั้น มีสคริปต์ง่าย ๆ ไหม?


1
อ้างอิงสิ่งนี้: winashwin.wordpress.com/2012/08/28/mysql-search

คำตอบ:


1396

ในการรับตารางทั้งหมดที่มีคอลัมน์columnAหรือColumnBในฐานข้อมูลYourDatabase:

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

6
@Echo - คุณสามารถเล่นกับ mysqldump ด้วย --skip-extended-insert และจากนั้น 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
ฉันแค่พยายามนี้ show tables;แต่สังเกตเห็นผลทั้งหมดที่ฉันมีที่สำหรับวัตถุที่จะไม่แสดงขึ้นด้วยแบบสอบถาม ทุกคนสามารถอธิบายได้ว่าทำไมถึงเป็นเช่นนั้น
wdkrnls

46

ทำได้ง่ายขึ้นใน SQL หนึ่งบรรทัด:

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

มีข้อเสียของการใช้ * ที่นี่หรือไม่?
Guney Ozsan


19

ในเวอร์ชันที่ไม่มีinformation_schema(เวอร์ชั่นเก่ากว่าหรือบาง ndb's) คุณสามารถดัมพ์โครงสร้างตารางและค้นหาคอลัมน์ด้วยตนเอง

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

ตอนนี้ค้นหาชื่อคอลัมน์ในการsome_file.sqlใช้โปรแกรมแก้ไขข้อความที่คุณต้องการหรือใช้สคริปต์ที่ดีบางอย่าง


และสคริปต์ง่าย ๆ ในการค้นหาคอลัมน์เพียงแทนที่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');

สิ่งนี้มีประโยชน์จริง ๆ เมื่อเราเริ่มใช้ai_colคอลัมน์พิเศษของ InnoDB อย่างช้าๆและจำเป็นต้องทราบว่า 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'



2

ข้อมูลเกี่ยวกับ information_schema คือมันอาจช้ามาก มันเร็วกว่าที่จะใช้คำสั่ง SHOW

หลังจากที่คุณเลือกฐานข้อมูลคุณจะส่งแบบสอบถามเป็นครั้งแรก SHOW TABLES และจากนั้นคุณก็แสดงคอลัมน์สำหรับแต่ละตาราง

ใน PHP นั้นจะมีหน้าตาเป็นอย่างไร

    $ res = mysqli_query ("SHOW TABLES");
    ในขณะที่ ($ row = mysqli_fetch_array ($ res))
    {$ rs2 = mysqli_query ("SHOW COLUMNS FROM". $ row [0]);
        ในขณะที่ ($ 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 และ ColumnB แทนที่จะเป็น ColumnA หรือ ColumnB เหมือนคำตอบที่ยอมรับ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.