PostgreSQL 在跳过关系错误时输入批量数据
PostgreSQL input bulk data While Skipping Relation Error
我正在使用 PG_Admin 工具对 PostgreSQL 进行批量插入,table 字段 anamnesa_id
包含与其他 table pasien_anamnesa
,
有没有办法在插入所有查询时忽略或跳过(其他 table 中不存在的错误)错误?因为对于这么多数据(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
只能处理唯一约束,不能处理外键或检查约束。
您需要重写查询以使用仅 returns 存在外键的行的 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;
我正在使用 PG_Admin 工具对 PostgreSQL 进行批量插入,table 字段 anamnesa_id
包含与其他 table pasien_anamnesa
,
有没有办法在插入所有查询时忽略或跳过(其他 table 中不存在的错误)错误?因为对于这么多数据(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
只能处理唯一约束,不能处理外键或检查约束。
您需要重写查询以使用仅 returns 存在外键的行的 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;