2010-09-20 24 views
1

我需要每天导入一个具有数千行数十行的csv文件到Postgres数据库。我正在研究最有效的方法,因为csv文件中的每一行都可以是新记录,或者是现有的记录,如果它在那里就应该更新。许多搜索后,我偶然发现了一个解决方案,我用:Postgres规则,以帮助CSV导入

CREATE OR REPLACE RULE insert_on_duplicate_update_advertiser_campaign_keywords_table AS 
    ON INSERT TO advertiser_campaign_keywords 
    WHERE (new.phrase, new.match_type, new.advertiser_campaign_id) IN (
    SELECT phrase, match_type, advertiser_campaign_id 
    FROM advertiser_campaign_keywords 
    WHERE phrase = new.phrase AND match_type = new.match_type AND advertiser_campaign_id = new.advertiser_campaign_id AND state != 'deleted') 
DO INSTEAD 
    UPDATE advertiser_campaign_keywords 
    SET bid_price_cpc = new.bid_price_cpc 
    WHERE phrase = new.phrase AND match_type = new.match_type AND advertiser_campaign_id = new.advertiser_campaign_id; 

这是我来工作的解决方案最接近的,但它是不完整的。它未能在插入看起来像这样:

INSERT INTO advertiser_campaign_keywords (phrase, bid_price_cpc, match_type, advertiser_campaign_id) VALUES 
('dollar', 1::text::money, 'Broad', 1450), 
('two words', 1.2::text::money, 'Broad', 1450), 
('two words', 1.0::text::money, 'Broad', 1450), 
('three words exact', 2.5::text::money, 'Exact', 1450), 
('four words broad match', 1.1::text::money, 'Exclusive', 1450), 
('three words exact', 2.1::text::money, 'Exact', 1450); 

的错误信息是:

duplicate key value violates unique constraint "unique_phrase_campaign_combo" 

unique_phrase_campaign_combo样子:除非为已删除的记录标记

CONSTRAINT "unique_phrase_campaign_combo" UNIQUE ("phrase", "advertiser_campaign_id", "match_type", "deleted_at") 

deleted_at为空。

任何人都知道我可以如何解决这个问题?

谢谢

+0

顺便说一句 - 在MySQL中,你可以使用所提供的答案在这里:http://stackoverflow.com/questions/1361340/how-to-insert-if-not-exists-in-mysql – warren 2011-02-17 12:49:20

+0

沃伦:MySQL有插入忽略,并且postgres不 – monksy 2011-02-19 03:46:53

回答

4

要做到这一点,最好的方法是添加一个临时表。使用副本填充登台表。然后用它来做你的插入和更新。

UPDATE target_table t 
    SET ... 
FROM staging_table s 
WHERE t.id = s.id 

INSERT INTO target_table 
SELECT * FROM staging_table s 
WHERE s.id NOT EXISTS (
    SELECT id FROM target_table 
)