跳到主要内容

可更新视图

视图上的更新怎样落到表上?​

  • 前提: 大多数视图无法进行更新操作, 能更新的称为可更新视图;
  • 机制: 对视图的更新被转换为对表的更新;
  • 反向同步: 对关系的更新总会影响到对应视图;

为什么大多数视图不可更新?​

  • 映射困难: 视图的一行可能来自聚集、分组或多表连接, 无法反推回唯一的基表行;
  • 结果歧义: 向视图插入一行时, 无法确定该写进哪张基表的哪个属性;
  • 结论: 只有视图与单个基表保持一一对应时, 更新才能无歧义地转换;

视图可更新需要满足哪些条件?​

  • 来源关系: 视图只对应单个关系 R;
  • SELECT: 不可使用 DISTINCT;
  • FROM: 只能有一个关系 R;
  • WHERE: 子查询中不可引用 R;
  • 属性: 视图属性要包括足够多的属性;
  • 行为: 满足条件后, 更新操作与直接操作表相同;
UPDATE ParamountMovies
SET year = 1991
WHERE title = 'The Godfather';
  • 效果: 该语句最终作用在 Movies 表的对应元组上;

(source: 070-视图和索引.md §虚拟视图/§视图更新表/§可更新视图)