我不熟悉mysql中的用户变量,在尝试将它们用于select语句以外的任何语句时遇到了一些错误。我正在尝试运行批处理作业以删除在数据库中创建的临时视图。过程是:
步骤1:识别临时视图并将列表放入变量中。
步骤2:测试变量是否为空
步骤3:删除视图
问题1:即使我没有测试null,drop也不起作用。我在第13行收到这个消息:error1064(42000):您的sql语法有错误;在第1行的“@viewlist\u pre”附近,检查与您的mysql服务器版本对应的手册,以获得正确的语法
问题2:包含空测试时,空测试不起作用。我收到这个错误:mysql:[警告]在命令行界面上使用密码可能不安全。第12行出现错误1064(42000):您的sql语法有错误;请查看与您的mysql服务器版本对应的手册,以获得正确的语法,以便在“if(@viewlist\u pre为空)附近使用,然后将view@viewlist\u 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的解决方案(根据我收集的信息,在一个准备好的语句中一次只能执行一个命令)。以下是批量投放的最终代码:
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条答案
按热度按时间cigdeys31#
我不能确定为什么或者如何创建这些临时视图,但是与其尝试定期进行一些大容量清理,不如使用:
就在当前用于创建每个临时视图的代码之前。
这样,视图是否存在就无关紧要了。
如果要继续进行看起来像是批量清理的操作,那么查询需要看起来更像这样:
生成的字符串如下所示:
那你需要用一个
prepared statement
执行生成的sql。不能仅将用户变量作为sql代码字符串包含在查询中。请参阅:mysql准备的satement语法
krugob8w2#
我调整了used\ by\ already的解决方案(根据我收集的信息,在一个准备好的语句中一次只能执行一个命令)。以下是批量投放的最终代码:
有人提出了一个很好的问题,即为什么没有使用定向投放。原因是它没有从php成功执行,但没有收到任何错误。然而,经过多次搜索,我发现了问题,现在可以做有针对性的下降。