知识卡片

"WHAT IF"查询揭示UPDATE的完整展开机制

普通读书笔记卡

内容

“What if”查询是一类探索”某个实际并未发生的变化如果真的发生会怎样”的 查询,比如”假设Paris的零件都改到Nice、且重量翻倍,结果会怎样”,用EXTEND即可 表达(这次EXTEND用来覆盖一个已有属性而不是新增属性):对P里CITY=‘Paris’的 每个元组t1,产生对应的t2,其weight是t1的两倍、city改成Nice。这类查询之所以 被放进本章,是因为它恰好能补全[[关系赋值统一INSERT_DELETE_UPDATE与赋值原理]] 里留下的一个悬念——UPDATE语句到底如何精确展开成关系赋值。以 UPDATE P WHERE CITY='Paris':{CITY:='Nice',WEIGHT:=2*WEIGHT}为例,完整展开 是:P:=(P WHERE CITY≠'Paris') UNION (EXTEND(P WHERE CITY='Paris'): {CITY:='Nice',WEIGHT:=2*WEIGHT})——即先把”不受影响的部分”和”受影响、已经 按新值更新过的部分”分别构造出来,再用并运算合成新的P。这正好印证了[[更新是 集合级别的运算]]中”更新R中的元组t1为t2”其实是”用r2=(r1 MINUS s1) UNION s2 整体替换R”的一般公式:这里s1就是P WHERE CITY='Paris'(被替换的旧子集), s2就是对s1做EXTEND产生的、已经计算好新值的子集——UPDATE语句因此可以看成 INSERT和DELETE这两种简写之上更复杂的第三种简写,本质仍然是一次完整的关系 赋值,而不是对单个元组做”原地修改”。

参考来源

- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第7章"SQL和关系代数 II:附加运算符"7.11节"'WHAT IF'查询"(源文件:OEBPS/text00084.html) - 结论依据:原文明确"关系理论的UPDATE运算符其实是对特定关系赋值的简写…… 这个语句逻辑等价于下面的关系赋值:P := (P WHERE CITY≠'Paris') UNION (EXTEND(P WHERE CITY='Paris'):{CITY:='Nice',WEIGHT:=2*WEIGHT})……'更新 关系变量R'实际上是使用一个关系r2来替换R的原本取值r1,其中r2由特定的关系 s1和s2根据(r1 MINUS s1)UNION s2计算得到"。 - 原始内容:关系理论的UPDATE运算符其实是对特定关系赋值的简写……这个语句 逻辑等价于下面的关系赋值:P := (P WHERE CITY≠'Paris') UNION (EXTEND (P WHERE CITY='Paris'):{CITY:='Nice',WEIGHT:=2*WEIGHT})。