创建视图后查询触发ER_PARSE_ERROR,如何复用视图并节省内存?
问题解决与优化方案
先解决语法报错问题
你的SQL语法错误是因为同一脚本中多个语句未用分号分隔,MySQL无法正确识别两个独立的SQL指令。修正后的语句如下(但这会创建永久视图,不符合你临时复用的需求):
CREATE VIEW root AS SELECT id FROM tmptable WHERE p_id IS NULL; SELECT * FROM root;
更优的临时复用方案(兼顾内存效率)
重要逻辑修正
你的表中p_id是VARCHAR类型,插入的是字符串'null'而非SQL原生的NULL值,所以原查询的WHERE p_id IS NULL会返回空结果,需改为WHERE p_id = 'null'才能得到正确的根节点数据。
方案1:CTE(公共表表达式,推荐MySQL 8.0+)
CTE是轻量化的临时查询定义,仅在当前查询会话中有效,不会存储到磁盘,内存占用最低,支持同一脚本内多次复用:
WITH root AS ( SELECT id FROM tmptable WHERE p_id = 'null' ) SELECT * FROM root; -- 同一脚本内可继续复用该CTE,例如统计根节点数量: -- SELECT COUNT(*) FROM root;
方案2:临时表(兼容MySQL 5.x)
临时表仅在当前会话存在,会话结束后自动销毁,数据量较小时会驻留内存,比永久视图更节省资源:
CREATE TEMPORARY TABLE root (id INTEGER); INSERT INTO root SELECT id FROM tmptable WHERE p_id = 'null'; SELECT * FROM root; -- 后续可继续对临时表执行查询、关联等操作
内容的提问来源于stack exchange,提问作者user2961927
相关产品推荐
相关产品推荐

