我知道View只是一个表的存储select查询。当我们调用视图时,select查询将在后端触发,并显示为视图的结果。
“我还知道我们可以从视图中更新/插入/删除数据,并且我们对视图所做的所有修改都将反映在基础表中。”
但这就是让我困惑的地方。
Q1:如果视图是一个简单的select查询,当它被调用时,它将后端执行select查询表单,更新/插入将如何在视图上工作。我不明白update/insert如何在"Select query“别名视图上工作?
Q2:我知道可以通过对底层表执行select来刷新视图。但是对视图所做的更改将如何影响底层表的数据呢?
当我们执行更新/删除/插入操作时,后端更新视图和底层表的机制是什么?

发布于 2018-07-11 11:57:52
首先,了解视图从不刷新(Oracle中的物化视图除外)。假设你已经创建了如下视图: create view myview as select * from t;
该视图查询将存储在数据库中。无论何时调用该视图,数据库都会加载存储的查询并执行,例如select * from myview
在上述情况下,数据库会将查询更改为like,并执行select * from (select * from t);
所以数据库总是从基表获取数据,而不是从视图(或刷新视图)获取数据。
对于您的第一个问题,请参见下面的更新myview set c1 = 123;在这种情况下,db会将此更新改为如下更新(select * from t) set c1 = 123;这在任何关系数据库管理系统中都是可行的。
对于您的第二个问题,使用视图的任何数据更改都只会影响基表数据,而不会更改/更新视图。
https://stackoverflow.com/questions/51275487
复制相似问题