2015-12-29 12 views
18

Sto scrivendo un programma di data mining, che inserisce in massa i dati dell'utente.Inserimento di massa, aggiornamento in caso di conflitto (invio cumulativo) su Postgres

SQL corrente è solo un semplice inserimento di massa:

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

Come faccio a fare un aggiornamento se il conflitto? Ho provato:

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

Ma genera l'errore There is a column named "a" in table "*SELECT*", but it cannot be referenced from this part of the query..

EDIT:

Tabella di USERS è molto semplice:

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

Qual è la chiave primaria? Qual è il codice di creazione della tabella? –

+0

@user Ho aggiunto il codice, è solo una tabella molto semplice –

risposta

45

Risulta una tabella speciale denominata excluded contiene la riga-to-be-inserita (nome strano però)

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

il set e le clausole WHERE in SU CONFLITTO DO UPDATE avere accesso alla riga esistente utilizzando il nome della tabella (o un alias), e alle righe proposto per l'inserimento utilizzando la tabella esclusi speciale ...

+5

Questo è solo 9.5+, come promemoria. – Nick

+0

Grazie amico. Ho salvato la mia giornata! –

+0

Questa denominazione è così strana, sono stato davvero confuso dalla parte esclusa. Grazie per il chiarimento. – adnan