知识卡片
全称量词化的系统化SQL映射步骤
内容
把[[全称量词化的系统化SQL映射步骤|FORALL约束]]转成SQL,需要连续应用
[[表达式变换法则工具箱]]里的多条法则,形成一套可重复的固定流程:以
“对表P每一行都要求:若颜色为红则城市为London”(FORALL PX(IF PX.COLOR=
'Red' THEN PX.CITY='London'))为例,第一步用量词化法则把FORALL转成
NOT EXISTS PX(NOT(IF PX.COLOR='Red' THEN PX.CITY='London'));第二步
用蕴涵律展开内层的IF…THEN…;第三步用德摩根律把NOT作用到AND/OR外层;
第四步用双重否定律消去多余的NOT(NOT(…));最终得到纯AND/NOT/EXISTS结构
NOT EXISTS PX(PX.COLOR='Red' AND PX.CITY<>'London')。这个纯逻辑结构
到SQL的映射本身也遵循固定规则:NOT直接映射为NOT;EXISTS PX(bx)映射为
EXISTS(SELECT * FROM P AS PX WHERE(bx'))(bx’是bx的SQL对应写法,这个
映射本身可能需要对bx递归再应用一遍这整套规则);整个结果打包进合适的
CREATE ASSERTION语句。这套”量词化法则→蕴涵律→德摩根律→双重否定律→逐条
映射为SQL”的固定五步流程,会在本章后续几乎所有例子里反复出现,是把任意
复杂的FORALL/IF…THEN…嵌套逻辑表述转成SQL的通用配方。
参考来源
- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第11章"使用逻辑
表述SQL表达式"11.3节"例2:全称量词化"(源文件:OEBPS/text00121.html)
- 结论依据:原文明确给出完整推导链"NOT EXISTS PX(NOT(IF PX.COLOR=
'Red'THEN PX.CITY='London'))……应用蕴涵律……应用德摩根律……应用双重
否定法则并删除一些括号……最终:NOT EXISTS PX(PX.COLOR='Red'AND
PX.CITY≠'London')""'EXISTS PX(bx)'映射为'EXISTS(SELECT*FROM P
AS PX WHERE(bx'))'"。
- 原始内容:应用蕴涵律……应用德摩根律……应用双重否定法则……最终:
NOT EXISTS PX(PX.COLOR='Red'AND PX.CITY≠'London')……'EXISTS PX
(bx)'映射为'EXISTS(SELECT*FROM P AS PX WHERE(bx'))'。