如何在PostgreSQL中从CSV文件导入时手动设置日期

时间:2013-12-11 19:02:56

标签: sql database postgresql date csv

我有一个表tdummy2,我从csv文件导入数据。之前我已将创建和更新列设置为now(),以使用当前时间戳自动更新列。

我现在希望导入的数据包含日期now()-interval '7 days'now-interval '30 days' etc.

此更新需要在每个不同的csv文件导入时发生,这意味着我有一个csv数据应该updatenow()-interval '7 days'而某些csv文件数据为now()-interval -'14 days',依此类推。< / p>

如何使用PostgreSQL数据库执行此操作?我是否应该每次都手动执行此操作,还是有任何方法可以在导入进行的同时更新列?

我当前的表架构:

create table tdummy2 (
 number1 integer,
 digit integer,
 type_digit integer,
 total integer,
 word character varying(256),
 apk character varying(256),
 version1 character varying(256),
 created  timestamp without time zone DEFAULT now() NOT NULL,
 updated  timestamp without time zone DEFAULT now() NOT NULL
);

1 个答案:

答案 0 :(得分:1)

您可以在交易期间设置自定义列默认值,然后重置:

BEGIN;
ALTER TABLE tbl ALTER COLUMN created SET DEFAULT (now() - interval '7 days')
               ,ALTER COLUMN updated SET DEFAULT (now() - interval '7 days');

COPY ...;

ALTER TABLE tbl ALTER COLUMN created SET DEFAULT now()
               ,ALTER COLUMN updated SET DEFAULT now();
COMMIT;

对多个列使用单个ALTER TABLE语句,这样会更便宜。

确保在单个事务中(在BEGIN; ... COMMIT;块内)完成所有操作,并发事务永远不会看到更改。但是,这将在事务持续期间锁定表。

那,或者你使用临时表到COPY并从那里插入到目标表中。考虑这个相关的答案:
How to bulk insert only new rows in PostreSQL