简短版本: 我应该使用什么 psql 命令来创建临时表,它是给定表的克隆,不包括给定列?
create temp table bar_temp as <columns from foo.bar excluding 'insert_date'>
推理: 我有一些非常大的 CSV 文件我想批量上传到 Postges 数据库(目前是 8.4 - 迁移到 9.x)。
上传这些 CSV 文件时,我想添加一个附加字段,例如“日期”字段。
使用这篇文章作为灵感:(如何使用 Postgres 中的 CSV 文件中的值更新选定的行?)我正在尝试执行以下操作:
- 从目标表的架构创建一个临时表,不包括“日期”列。
- 运行 '\COPY' 命令上传到临时表。
- 使用临时表中的条目 + 附加日期列条目更新目标表中的条目。
除了第 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”,但据我所知,我需要把它放在一个函数中,它的返回类型需要列出表列!
有什么建议么?