2015-12-29 42 views
18

Tôi đang viết chương trình khai phá dữ liệu, số lượng lớn chèn dữ liệu người dùng.Chèn số lượng lớn, cập nhật nếu xung đột (upsert số lượng lớn) trên Postgres

SQL hiện tại chỉ là một số lượng lớn chèn đơn giản:

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

Làm thế nào để làm một bản cập nhật nếu trên cuộc xung đột? Tôi đã thử:

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

Nhưng nó ném lỗi There is a column named "a" in table "*SELECT*", but it cannot be referenced from this part of the query..

EDIT:

Mục USERS rất đơn giản:

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

Khóa chính nào? Mã tạo bảng là gì? –

+0

@user Tôi đã thêm mã, nó chỉ là một bảng rất đơn giản –

Trả lời

45

Hóa ra một bảng đặc biệt có tên excluded chứa hàng-to-be-chèn (cái tên rất lạ mặc dù)

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

Các SET và mệnh đề WHERE trong ON XUNG ĐỘT DO CẬP NHẬT có quyền truy cập vào hàng hiện có sử dụng tên của bảng (hoặc một bí danh), và các hàng đề xuất cho chèn bằng cách sử dụng bảng loại trừ đặc biệt ...

+5

Đây là chỉ 9.5+, như một lời nhắc nhở. – Nick

+0

Cảm ơn người đàn ông. Lưu ngày của tôi! –

+0

Việc đặt tên đó thật kỳ lạ, tôi thực sự bối rối bởi phần bị loại trừ. Cảm ơn bạn đã làm rõ. – adnan

Các vấn đề liên quan