在 PostgreSQL 中使用 COPY FROM 命令在多个表中插入

Posted

技术标签:

【中文标题】在 PostgreSQL 中使用 COPY FROM 命令在多个表中插入【英文标题】:Use COPY FROM command in PostgreSQL to insert in multiple tables 【发布时间】:2018-10-11 17:51:19 【问题描述】:

我正在尝试使用 PostgreSQL 中的COPY FROM 命令的性能来获取 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)
);

【问题讨论】:

【参考方案1】:

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

假设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;

【讨论】:

嗨@Ilya Konyukhov,感谢您的回答。你给我一个想法(在这两个表中和更新后创建具有相同值的字段)。非常感谢!

以上是关于在 PostgreSQL 中使用 COPY FROM 命令在多个表中插入的主要内容,如果未能解决你的问题,请参考以下文章

COPY命令在字符串值中使用逗号 - Postgresql 10

PostgreSQL的“COPY table FROM file”语句可以在Go中使用吗?

Postgresql的Copy用法

PSQL /copy : 变量替换不起作用 | PostgreSQL 11

PostgreSQL copy协议与事务

使用 psycopg2 copy_expert 从 postgreSQL 表中更快地读取数据