将CSV文件中的内容加载到PostgreSQL表中

时间:2013-04-27 12:12:41

标签: postgresql plpgsql bulkinsert database-partitioning psql

下面介绍了我尝试将数据从文件加载到运行在Linux RedHat 7.2主机上的PostgreSQL 8.0数据库的过程。

现在,我的问题是调用了FOR EVERY ROW触发器并且程序正在执行。

我想要它做的是,一旦我在文件名中给出并根据记录的内容决定是否进行{{1},它会检查我的表中的相应行。 }或DUMP BULK DATA只有一次(在触发器上)。

请帮我解决这个问题...

我的DUMP WHOLE CSV FILE如下:

logfile.tmp

我正在使用的COPY命令:

27/Apr/2013:17:03:42 +0530#192.168.1.3#16#0@#$http://localhost/images/
   banner-left.jpg@#$10.1ff.ff.ff#-#Y#-
27/Apr/2013:17:03:42 +0530#192.168.1.3#16#0@#$http://localhost/images/
   banner-left.jpg@#$10.ff.ff.2ff05#-#Y#-

有问题的触发器(/usr/local/pgsql/bin/psql localhost -d d1 -U u1 -tc "COPY tblaccesslog ( accesstime, clientip, username, request,bytes, urlpath, url, contenttype, issite, webcatname) FROM 'logfile.tmp' WITH DELIMITER AS '#';" >> /tmp/parselog.log 2>&1 ):

insert_accesslog_trigger

最后使用了触发函数(insert_accesslog_trigger BEFORE INSERT ON tblaccesslog FOR EACH ROW EXECUTE PROCEDURE accesslog_insert_trigger() ):

accesslog_insert_trigger()

1 个答案:

答案 0 :(得分:2)

PostgreSQL documentation overview of triggers表明没有适合您要求的触发器类型:正如其名称所示,FOR EACH ROW触发器将针对每一行执行一次,并且作为手册页状态“语句级触发器目前无法检查由语句修改的各行。”

但是,您可以做的是将实际的COPY命令放在函数中。该函数可以COPY TO一个临时表,然后执行适当的步骤以确定它应该从哪里开始。

然后你的复制命令(我猜是在cron工作或类似工作)只会运行SELECT bulk_insert_access_log();而不是当前列出的长行。