MySQL - Как проверить пользовательскую переменную и использовать ее в DROP VIEW - PullRequest
0 голосов
/ 06 октября 2018

Я новичок в пользовательских переменных в MySQL и столкнулся с некоторыми ошибками при попытке использовать их для чего-либо, кроме оператора SELECT.Я пытаюсь запустить пакетное задание для удаления временных представлений, созданных в моей базе данных.Процесс:

Шаг 1: определить временные представления и поместить список в переменную.

Шаг 2: проверить переменную, чтобы определить, является ли она нулевой

Шаг3: отбросить представления

Проблема 1: отбрасывание не работает, даже если я не проверяю на ноль.Я получаю это сообщение: ОШИБКА 1064 (42000) в строке 13: у вас есть ошибка в вашем синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы узнать правильный синтаксис для использования рядом с @VIEWLIST_PRE в строке 1

Проблема 2: нулевой тест не работает, когда включен.Я получаю эту ошибку: mysql: [Предупреждение] Использование пароля в интерфейсе командной строки может быть небезопасным.ОШИБКА 1064 (42000) в строке 12: у вас есть ошибка в вашем синтаксисе SQL;обратитесь к руководству, соответствующему вашей версии сервера MySQL, чтобы узнать правильный синтаксис для использования рядом с 'IF (@VIEWLIST_PRE IS NULL) THEN DROP VIEW @VIEWLIST_PRE' в строке 1

Ниже приведен код.Как это должно быть написано для работы?Я очень ценю помощь!Спасибо !!

SET SESSION group_concat_max_len = 18446744073709551615;

-- Get the PreSummary views
SET @VIEWLIST_PRE = (SELECT
                    CONCAT(
                        GROUP_CONCAT(TABLE_NAME)
                    ) AS stmt
                    FROM information_schema.TABLES
                    WHERE TABLE_SCHEMA = "raptor" AND TABLE_NAME LIKE "%Pre%");

SELECT @VIEWLIST_PRE; -- THIS WORKS!
IF(@VIEWLIST_PRE IS NULL) THEN  -- BREAKS
    DROP VIEW @VIEWLIST_PRE;  -- BREAKS
END IF;

* РЕШЕНИЕ *

Я подправил решение Used_By_Already (только одна команда может быть выполнена за раз вподготовлено заявление, из чего я получаю).Вот окончательный код для массовой DROP:

SET @VIEWLIST_PRE = (SELECT
                    CONCAT(
                        GROUP_CONCAT(TABLE_NAME)
                    ) AS stmt
                    FROM information_schema.TABLES
                    WHERE TABLE_SCHEMA = "raptor" AND TABLE_NAME LIKE "%Pre%");
SET @DROP_VIEW_PRE = CONCAT('DROP VIEW IF EXISTS ', @VIEWLIST_PRE);
PREPARE stmt1 FROM @DROP_VIEW_PRE;
EXECUTE stmt1;

Был задан хороший вопрос о том, почему целевое снижение не используется.Причина в том, что он не выполняется успешно из PHP, но не было получено никакой ошибки.Однако после долгих поисков я обнаружил проблему и теперь могу выполнить целевое удаление.

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Я подправил решение Used_By_Already (только одна команда может быть выполнена за один раз в подготовленном утверждении, из того, что я собрал).Вот окончательный код для массовой DROP:

SET @VIEWLIST_PRE = (SELECT
                    CONCAT(
                        GROUP_CONCAT(TABLE_NAME)
                    ) AS stmt
                    FROM information_schema.TABLES
                    WHERE TABLE_SCHEMA = "raptor" AND TABLE_NAME LIKE "%Pre%");
SET @DROP_VIEW_PRE = CONCAT('DROP VIEW IF EXISTS ', @VIEWLIST_PRE);
PREPARE stmt1 FROM @DROP_VIEW_PRE;
EXECUTE stmt1;

Был задан хороший вопрос о том, почему целевое снижение не используется.Причина в том, что он не был успешно выполнен из PHP, но не было получено никакой ошибки.Однако после долгих поисков я обнаружил проблему и теперь могу выполнить целевое удаление.

0 голосов
/ 06 октября 2018

Я не могу быть уверен, почему или как вы создаете эти временные представления, но вместо того, чтобы пытаться выполнить массовую очистку на регулярной основе, почему бы просто не использовать:

drop view IF EXISTS some_view_name;

Непосредственно перед кодом, который выв настоящее время используется для создания каждого временного представления.

Таким образом, не имеет значения, существует представление или нет.


Если вы собираетесь приступить к тому, что выглядит как массовая чисткатогда запрос должен выглядеть примерно так:

SET @VIEWLIST_PRE = (concat((select group_concat(concat('drop view if exists ',table_name) SEPARATOR '; ')  
                             from information_schema.views 
                             where table_schema = 'raptor' and table_name  like'%Pre%')
                            ,';'))

, тогда сгенерированная строка будет выглядеть так:

drop view if exists Pre1; drop view if exists Pre2;

Затем вам нужно использовать prepared statement для выполнениячто генерирует SQL.Вы НЕ МОЖЕТЕ просто включить пользовательскую переменную КАК строку SQL-кода в качестве запроса.

См .: Синтаксис подготовленного MySQL синтаксиса

...