postgresql - PostgreSQL 输入批量数据时跳过关系错误
问题描述
我使用 PG_Admin 工具对 PostgreSQL 进行批量插入,表字段anamnesa_id
包含与其他表的 ForeignKey 关系pasien_anamnesa
,
有没有办法在插入所有查询时忽略或跳过(其他表中不存在)错误?因为对于这么多数据( 25.000 条记录)来说,逐个删除错误查询是不可能的,
我正在尝试:
INSERT INTO "pasien_item" ("id", "anamnesa_id") VALUES (1, 2) ON CONFLICT ON CONSTRAINT pasien_item_pkey DO NOTHING;
结果错误:
ERROR: insert or update on table "pasien_item" violates foreign key constraint "pasien_item_anamnesa_id_dc66b31b_fk_pasien_anamnesa_id"
DETAIL: Key (anamnesa_id)=(2) is not present in table "pasien_anamnesa".
SQL state: 23503
从那个错误我也试过:
INSERT INTO "pasien_item" ("id", "anamnesa_id") VALUES (1, 2) ON CONFLICT ON CONSTRAINT pasien_item_anamnesa_id_dc66b31b_fk_pasien_anamnesa_id DO NOTHING;
结果错误:
ERROR: constraint in ON CONFLICT clause has no associated index
SQL state: 42809
解决方案
ON CONFLICT
只能处理唯一约束,不能处理外键或检查约束。
您需要重写查询以使用仅返回存在外键的行的 SELECT:
INSERT INTO pasien_item(id, anamnesa_id)
select v.id, v.anamnesa_id
from (
VALUES (1, 2), ...
) v(id, anamnesa_id)
WHERE EXISTS (select *
from pasien_anamnesa pa
where pa.anamnesa_id = v.anamnesa_id)
ON CONFLICT ON CONSTRAINT pasien_item_pkey DO NOTHING;
推荐阅读
- css - 我可以在查询组上使用 CSS 兄弟运算符吗?
- spring-integration - 使用 MarshallingWebServiceInboundGateway 发送空响应
- gitlab - Gitlab 阻止从功能到主控的合并请求
- c# - EWS API,在 BindToItems 上未授权 401
- azure-blob-storage - Azure IoT Edge 模块日志 - 任务上传日志因错误而失败
- oracle - 通过codeignier将时间戳类型数据插入Oracle数据库
- typescript - Svelte TypeScript:向事件处理程序添加类型时出现意外的 tokensvelte(parse-error)
- java - Zabbix 和 JMX 连接被拒绝
- pyomo - Pyomo 无法在抽象 Set 构建之前对其进行迭代
- python - Python apscheduler 变量从后台计划任务到瓶子