You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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约束不会因为其他关联表的数据变更而被重新评估。

场景分析

针对你描述的操作流程:

  1. 向表a插入1:操作对象是表a,不会触发表b的CHECK约束评估
  2. 向表b插入1:如果约束支持子查询,此时会评估约束,确认1存在于表a的val列中,允许插入
  3. 从表a删除1:这个操作不会触发表b的CHECK约束评估,所以即使表b中存在违反约束的记录,数据库也不会主动检查或阻止该删除操作

内容的提问来源于stack exchange,提问作者Khushit Shah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 00:01:05