2015-12-29 35 views
18

衝突(散裝UPSERT)我寫一個數據挖掘程序,它的批量插入用戶數據。批量插入,更新,如果對Postgres的

當前的SQL只是一個簡單的批量插入:

insert into USERS(
    id, username, profile_picture) 
select unnest(array['12345']), 
    unnest(array['Peter']), 
    unnest(array['someURL']), 
on conflict (id) do nothing; 

如何,如果在衝突做一個更新?我試過了:

... 
    unnest(array['Peter']) as a, 
    unnest(array['someURL']) as b, 
on conflict (id) do 
update set 
    username = a, 
    profile_picture = b; 

但是它會拋出There is a column named "a" in table "*SELECT*", but it cannot be referenced from this part of the query.錯誤。

編輯

USERS表很簡單:

create table USERS (
    id  text not null primary key, 
    username text, 
    profile_picture text 
); 
+1

哪個是主鍵?什麼是表格創建代碼? @user我添加的代碼 –

+0

,這只是一個很簡單的表 –

回答

45

原來命名爲excluded一個特殊的錶行包含將要插入 (奇怪的名字雖然)

insert into USERS(
    id, username, profile_picture) 
select unnest(array['12345']), 
    unnest(array['Peter']), 
    unnest(array['someURL']) 
on conflict (id) do 
update set 
    username = excluded.username, 
    profile_picture = excluded.profile_picture; 

http://www.postgresql.org/docs/9.5/static/sql-insert.html#SQL-ON-CONFLICT

SET和WHERE關於衝突的條款DO UPDATE訪問使用表的名稱(或別名)的現有行,以行提出了使用特殊的排除插入表...

+5

這是9.5+只,作爲提醒。 – Nick

+0

謝謝你。拯救了我的一天! –

+0

這命名就是這麼奇怪,我真的被排除的部分混淆。感謝澄清。 – adnan