postgresql - 从 csv 复制到具有 id 序列列自动递增 PSQL 的表中
问题描述
寻找从 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 都是空的。
我在想也许我可以在复制后设置值。
解决方案
你可以写一个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');
推荐阅读
- autohotkey - 在自动热键中创建多个步骤
- jira - MID 服务器和内部 JIRA 服务器之间的端口和协议
- javascript - Javascript firestore:如何获取 where 查询的结果
- json - mulesoft中的json到xml转换
- java - 如何更改方面顺序?
- java - 关于在 Interceptor 中读取 POST 方法参数
- sql-server - 在同一 SQL 查询上运行的 10 个值
- javascript - 如何使用 Jest 和 Enzyme 测试 getDerivedStateFromProps
- oracle - 是否可以将 DBMS_SQLHASH.GETHASH 与绑定变量一起使用?
- vba - VBA如何在使用特定字符串时验证单元格?