知识卡片
补偿操作机制:级联规则维持多关系变量间派生约束
内容
承接[[互换性原理及其重要推论]]开头”S与LS/NLS哪个是基表哪个是视图本质上
可以互换”的论证,本节把LS、NLS、S全部设为基关系变量,逐一推导要维持
LS=S WHERE CITY='London'等约束成立所需的补偿操作(compensatory action)
——补偿操作是DBMS在用户请求的更新之外自动追加执行的附加更新,目的是防止
违反完整性约束,[[外键的精确定义与SQL_FOREIGN_KEY语法差异]]中的级联删除
正是补偿操作最典型的实例。具体到本例:从LS或NLS删除一行,需要级联删除S中
对应的行;反过来从S删除一行,需要级联删除LS或NLS中匹配的行;插入方向同理
需要”级联插入”规则。UPDATE可以理解为DELETE加INSERT的组合,用一个具体例子
说明补偿操作如何联动:把供应商S1的城市从S1所在城市改成Oslo,如果这条UPDATE
是针对S执行的,会先级联删除S1在旧的LS(假设原来在London)里的行,再级联
插入到NLS(因为Oslo不是London)——本质上S1这个”元组”看起来像从LS”搬”到了
NLS(书中特别提醒这个说法很不严谨);但如果同一条UPDATE换成直接针对LS执行,
则会先级联删除LS和S里的旧行,再尝试往LS里插入CITY为Oslo的新行,这次插入
会因为违反”LS的CITY必须是London”这条约束而失败,导致整个更新连同第一步的
删除都必须回滚,数据库保持不变——这正是[[数据库约束必须立即检查的理由与
语义优化]]和[[多重赋值解决延迟检查困境的更优方案]]主张的立即检查/原子回滚
语义的具体体现。最后要强调的是:这整套关于约束、补偿操作的推导,并不要求
DBA为每个视图手工穷举声明——理想情况下DBMS应该有能力从视图定义本身自动
推导出这些约束和配套的补偿操作,这与[[视图更新失败的本质是违反黄金规则或
赋值原理]]中对”约束推导”能力的期望完全一致。