用PSQL创建一个表,它是另一个表的克隆,但不包括一列。

6

简要版: 我应该使用哪个psql命令来创建临时表,该表是给定表的副本,但不包括给定列?

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

原因:

我有一些非常大的 CSV 文件,想要批量上传到 Postges DB(目前是 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",但据我所见,我需要将其放在一个函数中,在此函数的返回类型中列出表列!

你有什么建议吗?


您可以使用PL/PgSQL中的EXECUTE来完成此操作,通常使用FORMAT。查询information_schemapg_catalog视图以获取表列列表。我会把详细的示例留给其他人,但这应该能让您找到正确的方向。在SQL中没有“除了这个之外所有列”的概念。 - Craig Ringer
2个回答

7
您可以像这样做:
create table foo like bar;
alter table foo drop column baz;
-- and now full the thing

啊!当然了。在我的版本中,我必须使用“create temp table temp_tbl as select * from src_table where false”。 - Jim

1

感谢Denis在正确的方向上给我的指引,这是我的模板脚本:

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起作用...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接