首页 > 解决方案 > 根据其他表中的列更新表,并发生冲突

问题描述

我在 Postgres 数据库中有两个表。

表 A

用户 数量
麦克风 100
鲍勃 200
爱丽丝 50

表 B

团体 用户 数量
高手 麦克风 10
测试版 麦克风 15
高手 鲍勃 2
欧米茄 鲍勃 15
欧米茄 爱丽丝 25

我想更新表 b 并设置数量等于表 a 的数量 * 0.5 加入用户名 WHERE 表 b 组 = xyz。如果表b中不存在用户,我需要使用组xyz,用户名,表a的数量* 0.5来创建它。

我在这里有点东西,但是当用户在 tableb 中不存在时它无法处理,我不确定它是否是 postgres 的正确语法。

update tablea
set quantity = tableb.quantity * 0.5
from tableb
where tablea.username = tableb.username
and tablea.group = ace

标签: sqlpostgresqlsql-updateupsert

解决方案


TableB首先,在表中为列"group"和的组合添加一个唯一约束(如果它不存在)"user"

ALTER TABLE TableB ADD CONSTRAINT un_group_user UNIQUE("group", "user");

然后,您可以使用该INSERT语句将用户 from 插入TableA到子句TableBON CONFLICT,以便更新存在于 group 'xyz'in的用户的行TableB

INSERT INTO TableB("group", "user", quantity)
SELECT 'xyz', "user", quantity / 2.0
FROM TableA
ON CONFLICT("group", "user") DO UPDATE SET
quantity = EXCLUDED.quantity;

请参阅演示


推荐阅读