首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SQL只读数据库中创建视图的替代方法

问在SQL只读数据库中创建视图的替代方法
EN

Stack Overflow用户
提问于 2020-06-02 17:03:47
回答 1查看 90关注 0票数 0

我有一些较长的查询,可以创建视图来简化查询,但我正在读取的底层数据库已更改为只读。当然,视图不再被创建,但我害怕巨大的重构以及这些select语句在没有它的情况下的样子。我是不是漏掉了什么明显的东西?

EN

回答 1

Stack Overflow用户

发布于 2020-06-02 19:03:51

如果你使用的是MySQL 8,你可以通过使用CTE来做一些重构,例如,你可以这样做

代码语言:javascript
复制
with tmp_a as (select id from table_a), 
     tmp_b as (select id from tmp_a)
select * from tmp_a a join tmp_b b on a.id = b.id

这将允许您保持基本的代码结构,而不需要太多的工作,并且与当前代码一样具有描述性。

在CTE之前,您只需将视图的代码复制并粘贴到使用视图的任何位置。当MySQL运行您的查询时,它实际上执行完全相同的操作,但是如果您多次使用视图或大量嵌套,它看起来可能不像CTE那样干净。但是重构仍然仅限于复制和粘贴。

为了使用实际视图更接近您的当前情况,并且可能需要最少的重构,您可以将视图替换为临时表,这在只读数据库中是允许的:

代码语言:javascript
复制
create view tmp_a as select id from table_a

变成了

代码语言:javascript
复制
create temporary table tmp_a as select id from table_a

这有一个限制,即您不能在查询中多次使用这样的临时表(例如,在from/join中),因此您可能必须检查这种情况是否会发生,在这种情况下,您可能必须多次创建临时表(这可能会增加您的内存需求)。除此之外,除了临时表只能在创建临时表的会话中访问之外,您还可以像使用视图一样使用临时表,并且临时表将随会话一起消失。

如果你在一个只读从数据库(而不是静态数据库)上,如果你使用几个基表(例如,不从“view1”生成"view2“),你可能还必须确保你在一个事务中。与基于视图的单个查询(合并到一个大查询中)相比,临时表可能表示不同的时间。

另一种获取实际视图的方法是在服务器上添加一个非只读的虚拟数据库,在该服务器上创建视图并访问其他数据库。

代码语言:javascript
复制
create view tmp_a as select id from ro_db.table_a

您需要调整查询以引用正确的数据库,当然还必须设置数据库和权限。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62148464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档