使用来自 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
将数据保存到TEMPORARY
或UNLOGGED
表中;
INSERT INTO real_table SELECT ... FROM temp_table INNER JOIN other_table ...
换句话说,复制到一个临时表,然后生成带有连接的真实数据集,并将insert
连接产品添加到真实表中。
我是somewhat related to the bulk upsert problem。
因此,在您的情况下,您将在其中创建一个 temp_forms_member_registration
、copy
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 列的主要内容,如果未能解决你的问题,请参考以下文章