首页 文章

使用Postgres上的静态字段从CSV复制

提问于
浏览
0

我想将实际系统从CSV文件切换到PostgreSQL 9.5数据库到更高效的系统 .

由于其良好的性能,我想使用COPY声明 . 问题是我需要填充一个不在CSV文件中的字段 .

有没有办法让COPY语句为插入的所有行添加静态字段?完美的解决方案看起来像这样:

COPY data(field1, field2, field3='Account-005') 
FROM '/tmp/Account-005.csv' 
WITH DELIMITER ',' CSV HEADER;

你知道在每一行填充该字段的方法吗?

我的服务器正在运行node.js所以我愿意接受任何具有成本效益的解决方案,以便在复制它之前使用节点完成文件 .

2 回答

  • 0

    使用 temp table 导入 . 这允许您:

    • 添加/删除/更新列

    • 添加额外的文字数据

    • 删除或忽略记录(例如重复)

    ,在将新记录插入实际表之前 .


    -- target table
    CREATE TABLE data
        ( id SERIAL PRIMARY KEY
        , batch_name varchar NOT NULL
        , remote_key varchar NOT NULL
        , payload varchar
            , UNIQUE (batch_name, remote_key)
            -- or::
            -- , UNIQUE (remote_key)
        );
            -- temp table
    CREATE TEMP TABLE temp_data
        ( remote_key varchar -- PRIMARY KEY
        , payload varchar
        );
    
    COPY temp_data(remote_key,payload)
    FROM '/tmp/Account-005'
        ;
    
            -- The actual insert
            -- (you could also filter out or handle duplicates here)
    INSERT INTO data(batch_name, remote_key, payload)
    SELECT 'Account-005', t.remote_key, t.payload
    FROM temp_data t
        ;
    

    BTW可以自动执行上述操作:将文件名/文字作为参数放入函数(或准备语句)中 .

  • 0

    设置列的默认值:

    alter table data 
    alter column field3 set default 'Account-005'
    

    不要提及 copy 命令:

    COPY data(field1, field2) FROM...
    

相关问题