sql - 使用子查询中的数据时如何更新插入(Postgres)
问题描述
我有两张桌子:
assignments {recceptacleId, assignedCarrier}
rls_permissions {receptacleId, rlsUserId}
在这种情况下,转让是与航空公司关系的任何容器。
每当有新的分配进入assignments
表格时,我想插入(如果是新行则插入或更新,如果它是分配给新航空公司的现有容器)我的rls_permissions
表格。
我在使用 upsert 时遇到的问题,特别是 ON CONFLICT ON CONSTRAINT,是我的插入语句包含要插入的数据的子查询,因此我不确定如何编写语句的 DO UPDATE SET 部分
我已经尝试使用“排除”来尝试根据之前的冲突挑选出我想要更新的assignedCarrier,但是我一直收到“错误:列excluded.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");
例外的结果是,如果没有冲突,则将从子查询返回的数据插入到权限表的新行中。
如果存在冲突,我只想更新新分配的承运人,而不是更新或插入新行,因为该容器已经存在。
解决方案
您不需要 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 语句中检索到的值。
推荐阅读
- python - Docker在Dockerfile中编译python文件不要创建pyc
- node.js - 如何在服务器生成的 pdf 中创建复选框?
- go - 为什么我不能将 Error() 用于类型 validator.FieldError
- reactjs - 如何在 react.js 中按钮的 onClick 事件的同一窗口中显示表单
- c# - 用于自定义 XML 输入的动态 DataGrid 式解决方案
- java - 如何使用 maven 插件在构建路径中添加多个生成的文件夹
- angular - 嵌套表单组、表单数组的问题
- linux - 使用自己的 shell 脚本启动器在 linux 中运行多个后台进程
- python - Python用正则表达式分隔字符串
- spring-boot - 如何模拟 Spring Boot Session 和 SecurityContext 以进行测试