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

PostgreSQL更新余额表时触发非空约束违反错误的求助

解决PostgreSQL UPDATE语句中NOT NULL字段的NULL值错误

问题出在你的UPDATE语句里:WHERE条件选中了所有user_id IN (22,4)且symbol IN ('USDT','BTC')的行,但free和locked字段的CASE表达式只定义了部分(user_id, symbol)组合的逻辑,没有匹配到的行会返回NULL,而这两个字段有NOT NULL约束,因此触发报错。

修正后的SQL语句

UPDATE balances
SET free = CASE 
            WHEN user_id = 4 AND symbol = 'USDT' THEN COALESCE(free + 500, 0)
            WHEN user_id = 22 AND symbol = 'BTC' THEN COALESCE(free + 100, 0)
            ELSE free  -- 未匹配的行保持原free值,避免返回NULL
          END,
    locked = CASE 
            WHEN user_id = 22 AND symbol = 'USDT' THEN COALESCE(locked - 500, 0)
            WHEN user_id = 4 AND symbol = 'BTC' THEN COALESCE(locked - 100, 0)
            ELSE locked  -- 未匹配的行保持原locked值,避免返回NULL
          END
WHERE user_id IN (22, 4) AND symbol IN ('USDT', 'BTC');

关键修正说明

  • 给每个CASE表达式添加ELSE分支,直接返回字段原有值。这样所有被WHERE选中的行,无论是否需要修改,都会得到非NULL的赋值,不会违反NOT NULL约束。
  • COALESCE函数的作用是处理计算后可能出现的NULL(比如原字段值为NULL时,但你的字段默认是0且NOT NULL,这里其实可以简化,但保留也不影响)。

内容的提问来源于stack exchange,提问作者Pavneet Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 00:10:32