创建一个使用PSQL作为另一个表的克隆但不包括列的表

时间:2013-05-24 14:01:34

标签: sql postgresql psql

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

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

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

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

使用这篇文章作为灵感:( How to update selected rows with values from a CSV file in Postgres?)我正在尝试执行以下操作:

  1. 从目标表的架构创建临时表,不包括“日期”列。
  2. 运行'\ COPY'命令上传到临时表。
  3. 使用临时表中的条目+附加日期列条目更新目标表中的条目。
  4. 除了步骤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",但据我所知,我需要将它放在一个函数中,返回类型需要列出表列!

    有什么建议吗?

2 个答案:

答案 0 :(得分:6)

你可以这样做:

create table foo like bar;
alter table foo drop column baz;
-- and now full the thing

答案 1 :(得分:0)

感谢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工作..