在 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
该字段。
假设table1
和table2
表可以通过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中使用吗?