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