首页 > 解决方案 > 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

标签: postgresqlforeign-keyssql-insert

解决方案


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;

在线示例


推荐阅读