MySQL 5.7中子查询含不存在字段无报错,单独执行却报错的原因
问题原因解析
这是MySQL的列作用域解析规则导致的,具体逻辑如下:
- 单独执行子查询时,查询上下文只有表
b,而b中没有entity_id字段,所以直接抛出Unknown column 'entity_id' in 'where clause'错误,符合预期。 - 当子查询嵌套在主查询中时,MySQL会按「先子查询内部,再外层查询」的顺序解析字段:
- 先检查子查询的表
b是否存在entity_id,发现不存在; - 接着向上查找外层主查询的表
a,刚好a表有entity_id字段,于是MySQL会将子查询中的entity_id默认绑定为外层表a的字段,而非报错。
这时候子查询里的entity_id != 2实际上等价于主表a的entity_id != 2,和子查询的表b没有任何关联。
- 先检查子查询的表
- 当把
entity_id换成xaasaz这类无意义名称时,不管是子查询的表b还是外层的表a都不存在该字段,MySQL找不到可绑定的字段,就会立即触发未知列错误。
简单说就是:MySQL允许子查询引用外层查询的字段,当子查询内部找不到对应字段时,会自动向上找外层的,这就导致了这种看似矛盾的现象。
内容的提问来源于stack exchange,提问作者chaos
相关产品推荐
相关产品推荐

