【发布时间】:2019-03-11 11:46:16
【问题描述】:
我是 MySQL 中用户变量的新手,在尝试将它们用于除 SELECT 语句之外的任何内容时遇到了一些错误。我正在尝试运行批处理作业来删除在我的数据库中创建的临时视图。流程是:
第 1 步:识别临时视图并将列表放入变量中。
第二步:测试变量是否为空
第 3 步:删除视图
问题 1:drop 不起作用,即使我不测试 null。我收到此消息:第 13 行的 ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“@VIEWLIST_PRE”附近使用正确的语法
问题 2:包含 null 测试时不起作用。我收到此错误:mysql:[警告] 在命令行界面上使用密码可能不安全。 第 12 行的 ERROR 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 成功执行,但没有收到错误。但是,经过大量搜索,我发现了问题,现在可以进行有针对性的下降。
【问题讨论】:
-
我看到聚合方法 GROUP_CONCAT() 但没有 GROUP BY 子句,你确定 GROUP_CONCAT() 有感觉?
-
为什么要创建“临时视图”?似乎是一件很奇怪的事情。此外,您需要形成“动态 sql”以使用变量 as SQL.
-
该代码用于收集视图列表(我从另一个堆栈溢出帖子中获取)。在为报告创建数据透视表时,视图是由单独的代码生成的,而不是发布的。 :-)
标签: mysql variables null prepared-statement group-concat