SQL跨两表多字段关联Update更新报Group列无法插入NULL值问题
报错原因
你收到该报错的核心原因不是两张表存在多行,而是Second表中存在部分行的A、B、C三列组合,在First表中没有对应的匹配项:这种场景下你的更新语句里的子查询会返回NULL,而Second表的Group字段设置了非空约束,因此触发了报错。哪怕两张表单独存储的内容都没有NULL值,也会出现该问题。
解决办法
根据你的业务需求选择对应方案即可:
方案1:仅更新Second表中能和First表匹配到A、B、C组合的行,未匹配的行保留原有值
可以在更新语句中增加EXISTS匹配校验,只有存在对应匹配项时才执行更新,示例代码如下:UPDATE Second SET `Group` = ( SELECT DISTINCT `Group` FROM First WHERE First.A = Second.A AND First.B = Second.B AND First.C = Second.C ) WHERE EXISTS ( SELECT 1 FROM First WHERE First.A = Second.A AND First.B = Second.B AND First.C = Second.C )注意:
Group是SQL保留关键字,用反引号包裹可避免语法解析错误。方案2:需要更新Second表的所有行,未匹配到的行统一填充指定非空默认值
可以用COALESCE函数处理子查询返回的NULL值,示例代码如下:UPDATE Second SET `Group` = COALESCE( (SELECT DISTINCT `Group` FROM First WHERE First.A = Second.A AND First.B = Second.B AND First.C = Second.C), '你的默认值' -- 替换为实际业务需要的非空默认值 )
额外注意
如果First表中存在同一个A、B、C组合对应多个不同的Group值,你当前的子查询即使加了DISTINCT也会触发「子查询返回多行」的错误,这种情况需要明确取值规则,比如取最大值、最小值,把子查询里的DISTINCT替换为MAX/MIN这类聚合函数即可。
内容的提问来源于stack exchange,提问作者Kingsley Obeng
相关产品推荐
相关产品推荐

