COPY FROM
不会激活规则(http://www.postgresql.org/docs/9.0/interactive/sql-copy.html#AEN58860)
我的做法是将CSV数据装载到一个临时表,然后使用INSERT...SELECT
语句将数据复制到尚不存在的目标表中。 (如果CSV数据本身存在重复,请首先从临时表中删除这些重复项)。例如:
BEGIN;
CREATE TEMP TABLE stage_data(key_column, data_columns...) ON COMMIT DROP;
\copy stage_data from data.csv with csv header
-- prevent any other updates while we are merging input (omit this if you don't need it)
LOCK target_data IN SHARE ROW EXCLUSIVE MODE;
-- insert into target table
INSERT INTO target_data(key_column, data_columns...)
SELECT key_column, data_columns...
FROM stage_data
WHERE NOT EXISTS (SELECT 1 FROM target_data
WHERE target_data.key_column = stage_data.key_column)
END;
这将适用于实际的INSERT语句,但不适用于COPY。 – araqnid 2011-03-11 11:41:14
@araqnid:“COPY FROM将调用目标表上的任何触发器并检查约束,但它不会调用规则。”您可以使用BEFORE INSERT触发器并返回NULL来跳过重复项。 OTOH,触发器可能不是处理批量数据加载的最佳工具。 – 2011-03-11 21:02:52