简要版: 我应该使用哪个psql命令来创建临时表,该表是给定表的副本,但不包括给定列?
create temp table bar_temp as <columns from foo.bar excluding 'insert_date'>
原因:
我有一些非常大的 CSV 文件,想要批量上传到 Postges DB(目前是 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",但据我所见,我需要将其放在一个函数中,在此函数的返回类型中列出表列!
你有什么建议吗?
EXECUTE
来完成此操作,通常使用FORMAT
。查询information_schema
或pg_catalog
视图以获取表列列表。我会把详细的示例留给其他人,但这应该能让您找到正确的方向。在SQL中没有“除了这个之外所有列”的概念。 - Craig Ringer