PostgreSQL中带JOIN的UPDATE语句未按预期生效问题排查
问题分析与解决
问题出在你的UPDATE语句没有建立users_ill表与admin_employees/users表的关联关系,导致执行时形成了笛卡尔积:只要admin_employees中存在符合ae.admin_id = $2的记录,所有满足users_ill.read = false AND users_ill.tenant_id = $1的用户都会被更新——因为没有条件限制只更新和指定管理员关联的用户。
正确的写法需要在语句中把users_ill和关联表绑定起来,假设users_ill表有user_id字段关联到users.id,修改后的SQL如下:
UPDATE users_ill SET read = true FROM admin_employees ae INNER JOIN users u ON u.id = ae.user_id WHERE users_ill.read = false AND users_ill.tenant_id = $1 AND ae.admin_id = $2 AND users_ill.user_id = u.id; -- 新增关联条件,限定仅更新管理员关联的用户
也可以用更清晰的JOIN写法:
UPDATE users_ill ui SET read = true FROM admin_employees ae JOIN users u ON u.id = ae.user_id WHERE ui.read = false AND ui.tenant_id = $1 AND ae.admin_id = $2 AND ui.user_id = u.id;
核心就是必须让users_ill和管理员关联的用户建立明确的连接,避免无关联导致的全量更新。
内容的提问来源于stack exchange,提问作者oemer ok
相关产品推荐
相关产品推荐

