在冲突时执行SET foo = NOT EXCLUDED.foo无法按预期工作

时间:2019-05-01 13:13:29

标签: sql database postgresql

为什么如图所示,“活动”列未切换其布尔状态? 表users_strategies获得了主键约束pkey(id_strategy,id_account)

2 个答案:

答案 0 :(得分:1)

您正在传递true作为“排除”值,not true将为false,因此该列将设置为false。

如果要切换该值,则需要取反现有值:

set active = not user_strategies.active

对于以后的帖子,请以格式文本而不是(难以阅读的)屏幕截图显示代码。

答案 1 :(得分:1)

您要否定您设置为true冲突输入参数,但是您希望not true产生true吗?

只需跳过否定操作,您将使用与插入中指定的值完全相同的行来更新行:

INSERT INTO users_strategies (id_strategy, id_account, active)
VALUES (1, 48, true)
ON CONFLICT (id_strategy, id_account) DO
    UPDATE SET active = excluded.active
    RETURNING active, risk
;