MySQL - 如何测试用户变量并在 DROP VIEW 中使用它
MySQL - How to test user variable and use it in DROP VIEW
我是 MySQL 中用户变量的新手,在尝试将它们用于除 SELECT 语句之外的任何内容时,我遇到了一些错误 运行。我正在尝试 运行 一个批处理作业来删除在我的数据库中创建的临时视图。过程是:
第 1 步:识别临时视图并将列表放入变量中。
第 2 步:测试变量以查看它是否为 null
第 3 步:删除视图
问题 1:drop 不起作用,即使我不测试 null。我收到此消息:第 13 行出现错误 1064 (42000):您的 SQL 语法有误;查看与您的 MySQL 服务器版本对应的手册,了解在第 1
行的“@VIEWLIST_PRE”附近使用的正确语法
问题 2:空测试在包含时不起作用。我收到此错误:mysql:[警告] 在命令行界面上使用密码可能不安全。
第 12 行的错误 1064 (42000):您的 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 的解决方案(根据我的收集,在准备好的语句中一次只能执行 one command)。这是批量 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 成功执行,但没有收到错误。但是,经过大量搜索,我发现了问题所在,现在可以进行有针对性的投放了。
我不确定您为什么或如何创建这些临时视图,但与其尝试定期进行批量清理,不如直接使用:
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 代码的字符串作为查询。
我调整了 Used_By_Already 的解决方案(根据我的收集,在准备好的语句中一次只能执行 one command)。这是批量 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 成功执行,但没有收到错误。但是,经过大量搜索,我发现了问题所在,现在可以进行有针对性的投放了。
我是 MySQL 中用户变量的新手,在尝试将它们用于除 SELECT 语句之外的任何内容时,我遇到了一些错误 运行。我正在尝试 运行 一个批处理作业来删除在我的数据库中创建的临时视图。过程是:
第 1 步:识别临时视图并将列表放入变量中。
第 2 步:测试变量以查看它是否为 null
第 3 步:删除视图
问题 1:drop 不起作用,即使我不测试 null。我收到此消息:第 13 行出现错误 1064 (42000):您的 SQL 语法有误;查看与您的 MySQL 服务器版本对应的手册,了解在第 1
行的“@VIEWLIST_PRE”附近使用的正确语法问题 2:空测试在包含时不起作用。我收到此错误:mysql:[警告] 在命令行界面上使用密码可能不安全。 第 12 行的错误 1064 (42000):您的 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 的解决方案(根据我的收集,在准备好的语句中一次只能执行 one command)。这是批量 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 成功执行,但没有收到错误。但是,经过大量搜索,我发现了问题所在,现在可以进行有针对性的投放了。
我不确定您为什么或如何创建这些临时视图,但与其尝试定期进行批量清理,不如直接使用:
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 代码的字符串作为查询。
我调整了 Used_By_Already 的解决方案(根据我的收集,在准备好的语句中一次只能执行 one command)。这是批量 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 成功执行,但没有收到错误。但是,经过大量搜索,我发现了问题所在,现在可以进行有针对性的投放了。