知识卡片

"可能非确定性"表达式的判定规则

普通读书笔记卡

内容

[[SQL字符序与相等但可区分的值]]里已引入”可能非确定性”(possibly nondeterministic)概念——SQL标准定义为:在数据库数据完全相同的不同时刻, 如果同一个查询表达式除了行排序之外还可能产生不同的结果,就是可能非确定性 的(书中吐槽这个定义本身有点怪,因为查询结果理应根本不存在”行排序”这回 事)。这个属性的实际影响很严厚:可能非确定性的表达式不允许出现在完整性 约束里(若视图声明了CHECK OPTION,也不允许出现在视图定义里)——因为约束 必须对同一个数据库状态给出稳定一致的判定,一个可能在不同时刻给出不同答案 的表达式从根本上破坏了这个前提。判断一个表达式是否可能非确定性的完整规则 相当复杂,但书中给出几条足以触发这个判定的具体充分条件:表达式是对包含 字符串列的表做并/交/差;是一个SELECT表达式,其SELECT项列表里有字符串类型 的项,且同时满足”用了DISTINCT”“该项包含MAX/MIN调用”“该项是GROUP BY里的 分组列”三者之一;是带HAVING子句的SELECT,且HAVING引用了字符串类型的分组 列或对字符串调用了MAX/MIN;或者是以某个/全部运算元都是可能非确定性表达式 的JOIN。这些规则整体上比理论上”真正需要”的更严格——比如如果字符序采用 NO PAD且不含任何”相等但可区分”的字符对,SELECT MAX(C)FROM T其实是良定义 的,但因为规则本身不区分这种特殊情况,仍然会被笼统判定为可能非确定性。

参考来源

- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第12章"关于SQL的 其他主题"12.6节"'可能非确定性'表达式"(源文件:OEBPS/text00139.html) - 结论依据:原文明确"如果一个实现因为指定'实现依赖行为'的通用规则而生成 行排序差异之外的不同结果,那么,该……是可能非确定性的……'可能非确定性 的'表达式在完整性约束中是不被允许的……这些规则肯定比所需要的更为严格 ……SELECT MAX(C)FROM T这样的表达式就肯定是定义良好的(即不是'可能 非确定性的')"。 - 原始内容:'可能非确定性的'表达式在完整性约束中是不被允许的……这些规则 肯定比所需要的更为严格。