2015-12-29 15 views
18

पर संघर्ष (थोक अपरर्ट) पर अपडेट करें, मैं डेटा-खनन कार्यक्रम लिख रहा हूं, जो थोक डेटा उपयोगकर्ता को सम्मिलित करता है।थोक सम्मिलित करें, पोस्टग्रेज़

वर्तमान एसक्यूएल सिर्फ एक सादे थोक डालने है:

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

प्राथमिक कुंजी कौन सा है? टेबल निर्माण कोड क्या है? –

+0

@user मैंने कोड जोड़ा है, यह सिर्फ एक बहुत ही सरल तालिका है –

उत्तर

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

सेट और कहां पर संघर्ष में खंड DO अद्यतन तालिका का नाम (या एक उपनाम) का उपयोग कर मौजूदा पंक्ति की पहुंच है, और पंक्तियों के लिए विशेष रूप से बहिष्कृत तालिका का उपयोग कर प्रविष्टि के लिए प्रस्तावित ...

+5

यह केवल अनुस्मारक के रूप में 9.5+ है। – Nick

+0

धन्यवाद आदमी। मेरा दिन बचाया! –

+0

वह नामकरण इतना अजीब है, मैं वास्तव में बहिष्कृत भाग से उलझन में था। स्पष्टीकरण देने के लिए धन्यवाद। – adnan

संबंधित मुद्दे