2015-12-29 29 views
18

Piszę program do eksploracji danych, który zbiorczo wstawia dane użytkownika.Wstawianie luzem, aktualizacja w przypadku konfliktu (upsert bulk) na Postgresie

Obecny SQL jest tylko zwykły bulk insert:

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

Jak zrobić aktualizacji, jeśli na konflikt? Próbowałem:

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

Ale powoduje to błąd There is a column named "a" in table "*SELECT*", but it cannot be referenced from this part of the query..

EDIT:

Tabela USERS jest bardzo prosta

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

Który klucz podstawowy? Co to jest kod tworzenia tabeli? –

+0

@user Dodałem kod, to tylko bardzo prosta tabela –

Odpowiedz

45

Okazało się specjalnego tabeli nazwie excluded zawiera wstawiony wiersz do- (dziwną nazwę chociaż)

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 i WHERE IN KONFLIKTU DO UPDATE mieć dostęp do istniejącej rzędu przez nazwę tabeli (lub alias), oraz proponowane do wstawienia wierszy przy użyciu specjalnego wykluczone stół ...

+5

To jest tylko 9.5+, jako przypomnienie. – Nick

+0

Dzięki człowieku. Uratowałem mój dzień! –

+0

To nazewnictwo jest tak dziwne, naprawdę byłem zdezorientowany przez część wykluczoną. Dzięki za wytłumaczenie. – adnan