SQL-92标准下CHECK约束评估时机及子查询合法性问询
关于SQL-92标准中CHECK约束的问题
先看你给出的表定义:
create table a ( val INT ); create table b ( f CHECK ( f in (SELECT val from a)) );
a) 按照SQL-92标准,带子查询的CHECK约束是否被允许?
SQL-92标准明确禁止CHECK约束中包含子查询。该标准规定,CHECK约束的条件必须是不包含子查询的布尔表达式——约束只能依赖当前表的列值、常量,或者确定性函数,不能引用其他表的数据。
b) 若允许,CHECK约束何时执行?
虽然SQL-92不支持带子查询的CHECK约束,但假设这种约束被允许的话,根据标准对CHECK约束的评估规则:
- 当对约束所在表执行
INSERT或UPDATE操作时,会触发CHECK约束的评估,确保新插入/更新后的数据满足约束条件 - 关键一点:SQL-92标准中,CHECK约束不会因为其他关联表的数据变更而被重新评估。
场景分析
针对你描述的操作流程:
- 向表a插入1:操作对象是表a,不会触发表b的CHECK约束评估
- 向表b插入1:如果约束支持子查询,此时会评估约束,确认1存在于表a的
val列中,允许插入 - 从表a删除1:这个操作不会触发表b的CHECK约束评估,所以即使表b中存在违反约束的记录,数据库也不会主动检查或阻止该删除操作
内容的提问来源于stack exchange,提问作者Khushit Shah
相关产品推荐
相关产品推荐

