كيفية العثور على كافة الجداول في MySQL محددة أسماء الأعمدة في نفوسهم ؟

StackOverflow https://stackoverflow.com/questions/193780

  •  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)
               ....
        }
    }

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top