5

简短版本: 我应该使用什么 psql 命令来创建临时表,它是给定表的克隆,不包括给定列?

create temp table bar_temp as <columns from foo.bar excluding 'insert_date'>

推理: 我有一些非常大的 CSV 文件我想批量上传到 Postges 数据库(目前是 8.4 - 迁移到 9.x)。

上传这些 CSV 文件时,我想添加一个附加字段,例如“日期”字段。

使用这篇文章作为灵感:(如何使用 Postgres 中的 CSV 文件中的值更新选定的行?)我正在尝试执行以下操作:

  1. 从目标表的架构创建一个临时表,不包括“日期”列。
  2. 运行 '\COPY' 命令上传到临时表。
  3. 使用临时表中的条目 + 附加日期列条目更新目标表中的条目。

除了第 1 步之外,这一切都很简单。如果事先知道列名,则可以对这一行进行硬编码。在我的情况下,我有许多具有相应表的类似输入文件,并且希望解决方案能够灵活地处理模式中的更改。

我的 hacky 解决方案是有一个预处理脚本来确定临时表模式,然后在运行之前将该 CREATE 命令写入 SQL 脚本,例如:

"SELECT 'SELECT ' || array_to_string(ARRAY(SELECT 'o' || '.' || c.column_name FROM information_schema.columns As c WHERE table_name = '$table' AND c.column_name NOT IN('dt')), ',') || ' FROM $schema.$table As o'"

这给了我类似的东西

SELECT o.name,o.address from foo.bar As o

然后可以在 create 语句中使用

create temp table temp_tbl as SELECT o.name,o.address from foo.bar As o

但是我认为应该不要在 PSQL 脚本本身中执行此模式发现步骤。我看过使用“EXEC”,但据我所知,我需要把它放在一个函数中,它的返回类型需要列出表列!

有什么建议么?

4

2 回答 2

6

你可以这样做:

create table foo like bar;
alter table foo drop column baz;
-- and now full the thing
于 2013-05-24T15:29:35.690 回答
0

感谢丹尼斯的正确方向,这是我的模板脚本:

create temp table $tempTable as SELECT * from $schema.$table where false;
alter table $tempTable drop column $dateColumn;
\\COPY $tempTable FROM '$file' CSV HEADER
DELETE from $schema.$table where $dateColumn='$dt'::date;\
INSERT into $schema.$table select '$dt'::date, * from $tempTable;
DROP TABLE $tempTable;

虽然我仍然很想知道我怎么能开始EXECUTE工作..

于 2013-05-28T09:37:13.397 回答