使用来自 csv 的副本时更新另一个表中的 ID 列

Posted

技术标签:

【中文标题】使用来自 csv 的副本时更新另一个表中的 ID 列【英文标题】:Update ID column from another table while using copy from csv 【发布时间】:2014-06-03 17:47:53 【问题描述】:

我正在尝试使用 COPY 从 csv 文件将数据导入表。这是我要导入的表:

CREATE TABLE public.forms_member_registration
(
   baseformmodel_ptr_id integer NOT NULL,
   "Agrihub" character varying(200) NOT NULL,
   "Ward_Number" character varying(300) NOT NULL,
   "Area" character varying(300) NOT NULL,
   "First_Name" character varying(300) NOT NULL,
   "Last_Name" character varying(300) NOT NULL,
   "Other_Name" character varying(300) NOT NULL,
   -----------snip--------------------------------
   "L3_Modules_Completed" character varying(200),
   "L3_Specify_Other" character varying(300) NOT NULL,
   gps_location geometry(Point,4326),

   CONSTRAINT forms_member_registration_pkey 
      PRIMARY KEY (baseformmodel_ptr_id),
   CONSTRAINT baseformmodel_ptr_id_refs_id_c03f6c72 
      FOREIGN KEY (baseformmodel_ptr_id)
          REFERENCES public.forms_baseformmodel (id) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED
)

主键引用这个表:

CREATE TABLE public.forms_baseformmodel
(
    id integer NOT NULL DEFAULT nextval('forms_baseformmodel_id_seq'::regclass),
    user_id integer NOT NULL,
    created_at timestamp with time zone NOT NULL,

    CONSTRAINT forms_baseformmodel_pkey 
        PRIMARY KEY (id),
    CONSTRAINT user_id_refs_id_3a410ec9 
        FOREIGN KEY (user_id)
           REFERENCES public.auth_user (id) MATCH SIMPLE
           ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED
)

我正在使用这个复制命令:

COPY forms_member_registration("Agrihub", "Ward_Number", "Area","First_Name",        "Last_Name", "Other_Name", "SA_ID_Number", "Gender", "Phone_Number") FROM '/opt/project/migration/file-3.csv' DELIMITER ',' CSV HEADER;

给出这个错误:

ERROR:  null value in column "baseformmodel_ptr_id" violates not-null constraint

所以我看到的问题是,需要从 forms_baseformmodel 表的 id 列中检索每个条目的“baseform_ptr_id”,但只有在对 forms_baseformmodel 进行条目时才会创建 id。

如何在 forms_baseformmodel 中创建条目、检索它并将其添加到正在复制的元组中?

希望这是有道理的......这对我来说有点新鲜。

提前致谢

【问题讨论】:

【参考方案1】:

这是一个相当普遍的问题。你必须做的是:

COPY 将数据保存到TEMPORARYUNLOGGED 表中;

INSERT INTO real_table SELECT ... FROM temp_table INNER JOIN other_table ...

换句话说,复制到一个临时表,然后生成带有连接的真实数据集,并将insert 连接产品添加到真实表中。

我是somewhat related to the bulk upsert problem。

因此,在您的情况下,您将在其中创建一个 temp_forms_member_registrationcopy csv,包括您希望替换的 user_id 列,然后:

INSERT INTO forms_member_registration(
  baseformmodel_ptr_id, 
  "Agrihub", 
  ...
)
SELECT 
  fbfm.id, 
  tfmr."Agrihub",
  ...
FROM temp_forms_member_registration tfmr
INNER JOIN forms_baseformmodel ON (tfmr.user_id = fbfm.user_id);

【讨论】:

以上是关于使用来自 csv 的副本时更新另一个表中的 ID 列的主要内容,如果未能解决你的问题,请参考以下文章

MS Access 导入 csv 广告覆盖表中的数据

Oracle 删除表中的重复行并使用另一个表中的值更新行

创建一个触发器,当另一个表中的列更新时更新一个表上的列

如何通过将一个表中的 id 与另一个表匹配来选择和更新一个表中的记录?

从 CSV 更新列

使用 DynamoDB 流 捕获表活动