我有两个表:
assignments {recceptacleId, assignedCarrier}
rls_permissions {receptacleId, rlsUserId}
在这种情况下,指的是任何承运人与航空公司之间的关系。
每当有新任务分配到assignments
表中时,我都想在我的rls_permissions
表中进行增补(插入新行或更新(如果已将现有容器分配给新的航空公司))
我在upsert中遇到的问题,特别是ON CONFLICT ON CONSTRAINT,是我的插入语句包含要插入的数据的子查询,因此我不确定如何编写其中的DO UPDATE SET部分声明
我已经尝试使用“排除”来尝试根据先前的冲突来选择要更新的assignedCarrier,但是我一直收到“错误:排除的列。receptacleId不存在”
我的pkey看起来像这样:
CREATE UNIQUE INDEX rls_permissions_pkey ON rls_permissions("receptacleId" text_ops);
虚拟数据可能是:
receptacleID assignedCarrier
aaaaaaaaaa00 AA
AA在哪里是“美国航空公司”
INSERT INTO rls_permissions ("receptacleId","rlsUserId")
SELECT DISTINCT assignments."receptacleId", assignments."assignedCarrier"
FROM assignments
ON CONFLICT ON CONSTRAINT rls_permissions_pkey
DO UPDATE SET "rlsUserId" = (SELECT DISTINCT assignments."assignedCarrier"
FROM assignments
WHERE assignments."receptacleId" = excluded."receptacleId");
例外结果是,如果没有冲突,则将从子查询返回的数据插入到权限表的新行中。
如果发生冲突,我只想更新新分配的运营商,而不更新或插入新行,因为该插座已经存在。
答案 0 :(得分:0)
在UPDATE部分中不需要子查询。您可以通过excluded
关键字来访问INSERT部分的值。
INSERT INTO rls_permissions ("receptacleId","rlsUserId")
SELECT DISTINCT assignments."receptacleId", assignments."assignedCarrier"
FROM assignments
ON CONFLICT ON CONSTRAINT rls_permissions_pkey
DO UPDATE SET "rlsUserId" = excluded."rlsUserId";
对excluded."rlsUserId"
的引用是指将被插入到rlsUserId列中的值,因此它是通过assignments."assignedCarrier"
从SELECT语句中检索到的值。