可更新视图
视图上的更新怎样落到表上?
- 前提: 大多数视图无法进行更新操作, 能更新的称为可更新视图;
- 机制: 对视图的更新被转换为对表的更新;
- 反向同步: 对关系的更新总会影响到对应视图;
为什么大多数视图不可更新?
- 映射困难: 视图的一行可能来自聚集、分组或多表连接, 无法反推回唯一的基表行;
- 结果歧义: 向视图插入一行时, 无法确定该写进哪张基表的哪个属性;
- 结论: 只有视图与单个基表保持一一对应时, 更新才能无歧义地转换;
视图可更新需要满足哪些条件?
- 来源关系: 视图只对应单个关系 R;
SELECT: 不可使用DISTINCT;FROM: 只能有一个关系 R;WHERE: 子查询中不可引用 R;- 属性: 视图属性要包括足够多的属性;
- 行为: 满足条件后, 更新操作与直接操作表相同;
UPDATE ParamountMovies
SET year = 1991
WHERE title = 'The Godfather';
- 效果: 该语句最终作用在
Movies表的对应元组上;
(source: 070-视图和索引.md §虚拟视图/§视图更新表/§可更新视图)