2015-06-12 4 views
1

У меня есть хранимая процедура, которая должна выполнить пример кода:граф все таблицы MySQL с именем похож на колонке

IF EXISTS (
 
       SELECT TABLE_NAME 
 
       FROM INFORMATION_SCHEMA.COLUMNS 
 
       WHERE TABLE_NAME IN ('TB1', 'TB2', 'TB3') 
 
       AND COLUMN_NAME = 'COL' 
 
       AND table_schema = 'TestDB' 
 
        GROUP BY TABLE_NAME 
 
        HAVING count (TABLE_NAME) = 3 
 
       ) 
 
       THEN 
 
        /*Used for debugging*/ 
 
        SELECT 'Tables EXIST' INTO msg; 
 
       ELSE 
 
        /*Used for debugging*/ 
 
        SELECT 'NON-EXISTENT TABLES !' INTO msg; 
 
       END IF 
 
​

В принципе, я хочу выше фрагмент кода, чтобы выбрать все указанные таблицы, имеет столбец с именем «COL». Я хочу сделать это только с помощью information_schema, ничего больше.

При проверке тестовый оператор (IF EXISTS) всегда возвращает false. То есть инструкция ELSE выполняется всегда, хотя мои три тестовые таблицы (TB1, TB2 и TB3) имеют поле COL. Какой грех я совершаю?

ответ

0

Вы могли бы сделать это как функция, как это:

Функция:

CREATE DEFINER=`root`@`localhost` FUNCTION `new_function`() RETURNS varchar(64) CHARSET utf8 
BEGIN 
    declare cnt int; 

    declare msg varchar(64); 

    select count(*) from (
    select distinct 
     table_name 
    from information_schema.columns 
     where table_name in ('TB1', 'TB2', 'TB3') 
     and column_name = 'COL' 
     and table_schema = 'TestDB' 
    ) tbls into cnt; 

    if cnt = 3 then 
     select 'tables exist' into msg; 
    else 
     select 'tables do not exists' into msg; 
    end if; 

RETURN msg; 
END 

А потом запустить это:

create schema TestDB; 

use TestDB; 

create table TB1(
    COL int 
); 

create table TB2(
    COL int 
); 

create table TB3(
    COL int 
);  

select new_function(); 

Вернёт: Таблицы Exist

+0

миллион спасибо @ Джон. оно работает ! –

0

Что-то параллельно с этим должны работать

select distinct 
    table_name 
from information_schema.columns 
    where column_name = 'CHARACTER_SET_NAME' 
    and table_name in ('CHARACTER_SETS', 'COLLATIONS', 'COLUMNS', 'TRIGGERS', 'FOO', 'BAR') 
; 

, где у вас есть эта

 SELECT TABLE_NAME 
     FROM INFORMATION_SCHEMA.COLUMNS 
     WHERE TABLE_NAME IN ('TB1', 'TB2', 'TB3') 
     AND COLUMN_NAME = 'COL' 
     AND table_schema = 'TestDB' 
      GROUP BY TABLE_NAME 
      HAVING count (TABLE_NAME) = 3 
     ) 

т.е. это:

select distinct 
    table_name 
from information.schema.columns 
    where table_name in ('TB1', 'TB2', 'TB3') 
    and column_name = 'COL' 
    and table_schema = 'TestDB' 

и если вы хотите, чтобы убедиться, что существуют все три таблицы и столбец «COL» напишите условие, чтобы проверить, что это значение равно 3

select count(*) from (
select distinct 
    table_name 
from information.schema.columns 
    where table_name in ('TB1', 'TB2', 'TB3') 
    and column_name = 'COL' 
    and table_schema = 'TestDB' 
) tbls 
; 
+0

спасибо. но я, похоже, не понимаю ваш код. Я разместил это для образовательного лица. чтобы быть ясным, скажем, у меня есть таблицы A, B и C. Мне нужен запрос, который вернет 2, если только две из таблиц имеют значение COL, в противном случае false. –