【问题标题】:PostgreSQL input bulk data While Skipping Relation ErrorPostgreSQL 输入批量数据时跳过关系错误
【发布时间】:2020-11-17 06:52:29
【问题描述】:

我正在使用 PG_Admin 工具对 PostgreSQL 进行批量插入,表字段 anamnesa_id 包含与其他表 pasien_anamnesa 的 ForeignKey 关系,

有没有办法在插入所有查询时忽略或跳过(其他表中不存在)错误?因为对于这么多数据(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

【问题讨论】:

    标签: postgresql foreign-keys sql-insert


    【解决方案1】:

    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;
    

    Online example

    【讨论】:

    • ERROR: syntax error at or near "v" LINE 2: .1, 2) v(id, anam... ^ SQL state: 42601 Character: 315
    • 好吧,显然你需要用你拥有的其他行替换 ... 部分
    • 是的,我已经做到了:INSERT INTO "pasien_item" ("id", "anamnesa_id", "DIAGNOSA") select v.id, v.anamnesa_id, v.DIAGNOSA from (VALUES (38410, 11732, 'OK') v(id, anamnesa_id, DIAGNOSA) WHERE NOT EXISTS (select * from pasien_anamnesa pa where pa.anamnesa_id = v.anamnesa_id) ON CONFLICT ON CONSTRAINT pasien_item_pkey DO NOTHING;
    • 应该是 EXISTS 而不是 NOT EXISTS 但语法有效:dbfiddle.uk/…
    • 啊,我错过了一个右括号,现在它工作了!谢谢大哥!
    猜你喜欢
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多