首页 > 解决方案 > 在 PostgreSQL 中使用 COPY FROM 命令在多个表中插入

问题描述

我正在尝试使用COPY FROMPostgreSQL 中的命令性能来获取 CSV 文件(CSV -> table1)的 1 个表的所有数据,我需要插入其他数据,但是,在一个新表中。我需要第一个表的主键作为第二个表的外键。示例:我需要在 table1 中插入 1,000,000 个名称,在 table2 中插入 500,000 个名称,但是,table2 中的所有名称都引用 table1 中的 1 个元组。

CREATE TABLE table1 (
   table1Id bigserial  NOT NULL,
   Name varchar(100)  NULL,
   CONSTRAINT table1Id PRIMARY KEY (table1Id)
);
CREATE TABLE table2 (
   table2Id bigserial  NOT NULL,
   Other_name varchar(100)  NOT NULL
   table1_table1Id int8  NOT NULL,
   CONSTRAINT table2_pk PRIMARY KEY (table2Id)
);

标签: postgresqldatabase-performancepostgresql-10sql-tuning

解决方案


命令COPY不允许在复制数据时进行表操作(例如查找其他表以获取要插入的正确外键)。要插入table2相应行的 ID,table1您需要分别删除该字段、数据和该字段NOT NULL的约束。COPYUPDATE

假设table1table2表可以通过 连接table1.Name = table2.Other_name,代码为:

复制前:

ALTER TABLE table2 ALTER COLUMN table1_table1Id DROP NOT NULL;

复制后:

UPDATE table2 SET table2.table1_table1Id = table1.table1Id
FROM table1
WHERE table1.Name = table2.Other_name;
ALTER TABLE table2 ALTER COLUMN table1_table1Id SET NOT NULL;

推荐阅读