知识卡片
蕴涵律实战:约束从IF...THEN...到SQL CHECK的映射
内容
[[逻辑蕴涵的形式化本质与自然语言直觉的偏离]]和[[表达式变换法则工具箱]]的
最基础应用:约束”红色零件必须存放在London”,形式化为IF COLOR='Red' THEN
CITY='London',SQL没有直接的IF…THEN…语法,用蕴涵律改写为
(NOT(COLOR='Red'))OR(CITY='London'),进一步用NOT(a=b)等价于a<>b
化简、去掉多余括号,得到可以直接作为基表CHECK约束书写的形式
CHECK(COLOR<>'Red' OR CITY='London')。这条变换有一个更一般的通用配方:
逻辑蕴涵IF p THEN q也可以直接映射到SQL的CASE表达式
CASE WHEN p' THEN q' ELSE TRUE END(p’、q’是p、q各自的SQL对应写法)——
两条路径(蕴涵律改写成OR,或CASE表达式)殊途同归,都能把”若p则q”这种SQL
原生不支持的结构转换成合法SQL;ELSE TRUE这个分支不能省略,因为
CASE WHEN p' THEN q' END在p’为假时默认落到隐式的ELSE NULL分支(呼应
[[避免null的实践规则NOT_NULL约束与COALESCE]]中CASE表达式若省略ELSE分支
的隐患),而蕴涵在前件为假时理应恒为真,用NULL替代TRUE会破坏这条语义。
参考来源
- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第11章"使用逻辑
表述SQL表达式"11.2节"例1:逻辑蕴涵"(源文件:OEBPS/text00120.html)
- 结论依据:原文明确"蕴涵律说明前面的表达式可以变换为:(NOT(COLOR=
'Red'))OR(CITY='London')……CONSTRAINT BTCX1 CHECK(COLOR<>'Red'
OR CITY='London')……通常,逻辑蕴涵IF p THEN q可以映射到SQL的CASE
表达式CASE WHEN p'THEN q'ELSE TRUE END"。
- 原始内容:蕴涵律说明前面的表达式可以变换为:(NOT(COLOR='Red'))OR
(CITY='London')……通常,逻辑蕴涵IF p THEN q可以映射到SQL的CASE表达式
CASE WHEN p'THEN q'ELSE TRUE END。