知识卡片
"可能非确定性"表达式的判定规则
内容
[[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这样的表达式就肯定是定义良好的(即不是'可能
非确定性的')"。
- 原始内容:'可能非确定性的'表达式在完整性约束中是不被允许的……这些规则
肯定比所需要的更为严格。