ฉันมีชื่อคอลัมน์ที่แตกต่างกัน 2-3 รายการที่ฉันต้องการค้นหาในฐานข้อมูลทั้งหมดและแสดงรายการตารางทั้งหมดที่มีคอลัมน์เหล่านั้น มีสคริปต์ง่าย ๆ ไหม?
ฉันมีชื่อคอลัมน์ที่แตกต่างกัน 2-3 รายการที่ฉันต้องการค้นหาในฐานข้อมูลทั้งหมดและแสดงรายการตารางทั้งหมดที่มีคอลัมน์เหล่านั้น มีสคริปต์ง่าย ๆ ไหม?
คำตอบ:
ในการรับตารางทั้งหมดที่มีคอลัมน์columnA
หรือColumnB
ในฐานข้อมูลYourDatabase
:
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('columnA','ColumnB')
AND TABLE_SCHEMA='YourDatabase';
DATABASE()
แทนสตริงเพื่อค้นหาในฐานข้อมูลที่เลือกในปัจจุบัน
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%wild%';
TABLE_SCHEMA
ในเขตข้อมูลของชุดการส่งคืนเพื่อดูฐานข้อมูล + ตารางทั้งหมดที่มีชื่อคอลัมน์นั้น
show tables;
แต่สังเกตเห็นผลทั้งหมดที่ฉันมีที่สำหรับวัตถุที่จะไม่แสดงขึ้นด้วยแบบสอบถาม ทุกคนสามารถอธิบายได้ว่าทำไมถึงเป็นเช่นนั้น
ทำได้ง่ายขึ้นใน SQL หนึ่งบรรทัด:
SELECT * FROM information_schema.columns WHERE column_name = 'column_name';
SELECT DISTINCT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE column_name LIKE 'employee%'
AND TABLE_SCHEMA='YourDatabase'
ในเวอร์ชันที่ไม่มี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 แต่ไม่สำคัญ
สำหรับผู้ที่กำลังค้นหาสิ่งที่ตรงกันข้ามเช่นกำลังค้นหาตารางที่ไม่มีชื่อคอลัมน์ที่แน่นอนนี่คือแบบสอบถาม ...
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 ตารางของเรายังไม่ได้รับการอัพเกรด
หากคุณต้องการ " เพื่อให้ได้ตารางทั้งหมดเท่านั้น " ให้ใช้แบบสอบถามนี้:
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'
ใช้เคียวรีหนึ่งบรรทัดนี้แทนที่ต้องการ _column_name ด้วยชื่อคอลัมน์ของคุณ
SELECT TABLE_NAME FROM information_schema.columns WHERE column_name = 'desired_column_name';
SELECT DISTINCT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE '%city_id%' AND TABLE_SCHEMA='database'
ข้อมูลเกี่ยวกับ 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) .... } }
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 เหมือนคำตอบที่ยอมรับ