知识卡片
视图更新失败的本质是违反黄金规则或赋值原理
内容
一个常见误解是”某些视图天生不可更新”(比如以S和P在{CITY}上的多对多连接
定义的视图SCP,直觉上似乎无法直接插入或删除元组)。书中纠正了这个说法:
向基关系变量的更新本来就可能因为违反完整性约束而失败(比如向SP插入一个
SNO不存在于S中的元组),视图的更新失败本质上是同一回事——不是视图”生来
不可更新”,而是对某些视图的某些更新会违反黄金规则(呼应[[约束与谓词逻辑
正确与现实正确的分离及爆炸原理]])或[[关系赋值统一INSERT_DELETE_UPDATE与
赋值原理]]中的赋值原理。以SCP为例,把它想象成一个真实存在、和S、P并存的
关系变量(约束是SCP=S JOIN P),插入一个London的新组合会成功(因为拆分
出的子元组和现有S、P的行一致);但插入一个London供应商配Madrid零件的组合
会陷入两难:要么只把用户指定的这一个元组插入SCP(导致SCP≠S JOIN P,违反
黄金规则,更新失败),要么系统自动向S、P补充额外的子元组以维持约束成立
(但这样最终写入SCP的内容就不再是用户当初指定的那个元组,违反赋值原理,
同样导致更新失败)。这个视角同时提醒了一个关键条件:要正确支持视图更新,
系统必须先具备约束推导(constraint inference)能力——从视图定义所涉及关系
变量的约束,自动推导出视图本身应该满足的总体约束(呼应[[视图约束是派生约束
且可表达基表层面难以直接表达的约束]]);当今大多数SQL产品在这方面几乎不具备
这种能力,这正是SQL视图更新支持普遍偏弱的根源所在。
参考来源
- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第9章"SQL与视图"
9.5节"更新运算"(源文件:OEBPS/text00104.html)
- 结论依据:原文明确"并不是说一些视图生来就是不可更新的,而是对某些视图的
某些更新在违反完整性约束时会失败……更新(不管是对基关系变量还是对视图)
在违反赋值原理时也会失败……设V为视图,为了支持对V的正确更新,系统需要
知道V的总体约束……它需要能够进行'约束推导'……当今的SQL产品几乎没有
(或几乎不能)进行这样的约束推导"。
- 原始内容:并不是说一些视图生来就是不可更新的,而是对某些视图的某些更新
在违反完整性约束时会失败……当今的SQL产品几乎没有(或几乎不能)进行这样
的约束推导。