Выберите таблицы, которые не содержат определенный столбец в MySQL - PullRequest
3 голосов
/ 10 марта 2011

Я пытаюсь выбрать все таблицы, в которых нет столбца с именем «уникальный».Я могу выбрать все таблицы, в которых он есть, используя:

SELECT DISTINCT TABLE_NAME 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME = 'unique'
AND TABLE_SCHEMA ='database';

Есть ли простой способ изменить инструкцию SELECT, чтобы она перечисляла все таблицы, у которых нет этого столбца?Кажется, это было бы просто, но я не могу понять это и не могу найти ответ на форуме.

Спасибо

Ответы [ 4 ]

6 голосов
/ 10 марта 2011
select
t.*
from INFORMATION_SCHEMA.TABLES as t
    left join INFORMATION_SCHEMA.COLUMNS as c
    on c.TABLE_NAME = t.TABLE_NAME
    and c.TABLE_SCHEMA = t.TABLE_SCHEMA
    and c.COLUMN_NAME = 'unique'
where c.COLUMN_NAME is null
and t.TABLE_SCHEMA = 'database'
1 голос
/ 02 марта 2012

Вышеуказанные запросы работают, если на сервере существует только одна база данных. Если нет, таблицы из других баз данных также будут перечислены. Рассмотрим эту упрощенную версию, которая выбирает таблицы из определенной БД. В общем, это отличный момент!

SELECT DISTINCT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = 'DATABASE_NAME' 
AND TABLE_NAME NOT IN (SELECT DISTINCT TABLE_NAME 
                            FROM INFORMATION_SCHEMA.COLUMNS 
                           WHERE COLUMN_NAME = 'FIELD_NAME' 
                             AND TABLE_SCHEMA ='DATABASE_NAME');
0 голосов
/ 10 марта 2011

Простая инверсия:

SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT IN

(SELECT DISTINCT TABLE_NAME 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME = 'unique'
AND TABLE_SCHEMA ='database');
0 голосов
/ 10 марта 2011
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME NOT IN (
SELECT DISTINCT TABLE_NAME 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME = 'unique'
AND TABLE_SCHEMA ='database')
...