كيفية العثور على كافة الجداول في MySQL محددة أسماء الأعمدة في نفوسهم ؟
-
10-07-2019 - |
سؤال
لدي 2-3 عمود مختلفة الأسماء التي لا تريد أن تبدو في كامل DB و قائمة من كافة الجداول التي لها تلك الأعمدة.أي من السهل السيناريو ؟
المحلول
لتحصل على كل الجداول مع الأعمدة columnA
أو ColumnB
في YourDatabase
قاعدة البيانات:
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('columnA','ColumnB')
AND TABLE_SCHEMA='YourDatabase';
نصائح أخرى
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%wild%';
والمزيد ببساطة القيام به في سطر واحد من 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 ل) يمكنك تفريغ بنية الجدول والبحث العمود يدويا.
mysqldump -h$host -u$user -p$pass --compact --no-data --all-databases > some_file.sql
والآن البحث في اسم العمود في some_file.sql
باستخدام محرر النصوص المفضل، أو استخدام بعض البرامج النصية AWK أنيق.
والسيناريو سد بسيطة للعثور على العمود، استبدال فقط <م> 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,
ويمكنك أنبوب تفريغ مباشرة في الحوار الاقتصادي الاستراتيجي ولكن هذا تافهة.
لأولئك الذين يبحثون عن عكس ذلك، أي تبحث عن الجداول التي لا تحتوي على اسم عمود معين، وهنا هو الاستعلام ...
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'
استخدم هذا الاستعلام سطر واحد، استبدال desired_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.
وبعد تحديد قاعدة البيانات أولا بإرسال الجداول توضح الاستعلام. ثم لا تظهر الأعمدة لكل من الجداول.
في PHP التي من شأنها أن ننظر بشيء من مثل
$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) .... } }