【问题标题】:Copy from csv into table with id serial column auto-incrementing PSQL从 csv 复制到具有 id 序列列自动递增 PSQL 的表中
【发布时间】:2020-01-05 03:57:04
【问题描述】:

寻找一种解析解决方案,该解决方案可以从 CSV 复制到我的数据库中,并生成序列 ID 的最终结果。无论是在后端,还是在复制时。照原样,复制后我的 ID 为空。

echo CREATE TABLE IF NOT EXISTS qs_facts_template (id SERIAL NOT NULL, symbol varchar(8), timestamp date, close real null, open real null, high real null, low real null, volume real null, CONSTRAINT qs_facts_template_key PRIMARY KEY (id)) WITH (OIDS=TRUE) TABLESPACE pg_default; ALTER TABLE qs_facts_template OWNER to postgres; | psql -U postgres -h %host% readyloop

echo CREATE TABLE IF NOT EXISTS qs_facts AS select * from qs_facts_template;| psql -U postgres -h %host% readyloop

echo \copy qs_facts (symbol, timestamp, close, open, high, low, volume) from PROGRAM 'cat C:\Users\user\Documents\quantshare\quotes.csv' DELIMITER ';' CSV HEADER| psql -U postgres -h %host% %dbName%

这篇文章:https://unix.stackexchange.com/questions/277080/copy-csv-data-while-simultaneously-filling-serial-column 没有解决我的问题。我使用了 Guido 提到的命令并让副本工作,但 id 都是空的。

我在想也许我可以在复制之后设置值。

【问题讨论】:

    标签: postgresql auto-increment


    【解决方案1】:

    问题是 copy 不会复制除列之外的所有内容,再加上您无法将表更改为串行的事实。

    所以我从原始模板表中导出了 pg4admin 中的脚本,并且能够派生出这个有效的脚本

        echo DROP materialized view if exists mv_qs_facts cascade| psql -U postgres -h %host% %dbName%
        echo DROP materialized view if exists mv_qs_symbols cascade| psql -U postgres -h %host% %dbName%
    
        echo DROP TABLE if exists qs_facts cascade| psql -U postgres -h %host% %dbName%
    
        echo drop table if exists qs_facts_template CASCADE;| psql -U postgres -h %host% readyloop
    Rem create qs_fact table    
        echo CREATE TABLE IF NOT EXISTS qs_facts_template (id SERIAL, symbol varchar(8), timestamp date, close real null, open real null, high real null, low real null, volume real null, CONSTRAINT qs_facts_template_key PRIMARY KEY (id)) WITH (OIDS=TRUE) TABLESPACE pg_default; ALTER TABLE qs_facts_template OWNER to postgres; | psql -U postgres -h %host% readyloop
    
        echo CREATE TABLE IF NOT EXISTS qs_facts AS select * from qs_facts_template; | psql -U postgres -h %host% readyloop
    
        echo ALTER TABLE public.qs_facts ADD CONSTRAINT qs_facts_key PRIMARY KEY (id); | psql -U postgres -h %host% readyloop
    
        REM I looked at psqladmin and exported the sequence from qs_facts_template
        REM http://www.postgresqltutorial.com/postgresql-serial/
        echo CREATE SEQUENCE public.qs_facts_id_seq INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 9223372036854775807 CACHE 1; ALTER SEQUENCE public.qs_facts_id_seq OWNER TO postgres;| psql -U postgres -h %host% readyloop
    
        echo ALTER TABLE public.qs_facts ALTER COLUMN id SET DEFAULT nextval('qs_facts_id_seq'); | psql -U postgres -h %host% readyloop
    

    【讨论】:

      【解决方案2】:

      你可以写一个BEFORE触发器:

      CREATE FUNCTION id_trigger() RETURNS trigger
         LANGUAGE plpgsql AS
      $$BEGIN
         NEW.id = nextval(pg_get_serial_sequence(TG_ARGV[0], 'id'));
         RETURN NEW;
      END;$$;
      
      CREATE TRIGGER id_trigger BEFORE INSERT ON qs_facts_template
         FOR EACH ROW EXECUTE PROCEDURE id_trigger('qs_facts_template');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-25
        • 1970-01-01
        • 1970-01-01
        • 2011-02-18
        • 1970-01-01
        • 2014-10-01
        • 2018-07-07
        • 2018-05-09
        相关资源
        最近更新 更多