2016-10-15 3 views
0

행을 postgres db에 일괄 삽입하려고하고 충돌 할 때 충돌 행을 업데이트하려고합니다. 나는 이것을하는 가장 좋은 방법이 무엇인지 궁금 하네. 쿼리는 현재 모든 행을 삽입 할 수 없지만 충돌시 제거하면 완벽하게 작동합니다. 내가 말할 수있는 것에서 어떤 오류도 발생하지 않는다. 여기 Postgresql 일괄 삽입 및 충돌 일괄 업데이트

내가 사용하고 현재 쿼리입니다 : 'INSERT INTO table (x1, x2, x3, ...) VALUES %s,%s,%s,%s,%s,%s,%s,%s,%s,%s,... ON CONFLICT DO UPDATE SET (x4, x5, x6) = %s,%s,%s,%s,%s,%s,%s,%s,%s,%s,...'

내가 가지고있는 형태의 튜플과 함께 %의 값을 채우는 기능 (X1, X2, ...)

내 테이블 이 모양은 Table "public.table" Column | Type | Modifiers
--------------+---------+----------------------------------------------- id | integer | not null default nextval('table_id_seq'::regclass) x1 | text | not null x2 | text | not null x3 | integer | not null x4 | text | not null x5 | text | not null x6 | text | not null Indexes: "table_feature_pkey" PRIMARY KEY, btree (id)

미리 감사드립니다. 추가 정보가 필요한 경우 알려주십시오.

+0

확실히이 w를 수행하는 것을 이해하지 i 배치 파일? 질문에 배치 파일 코드가 보이지 않습니다. – Squashman

답변

1

분명히 잘못된 구문을 사용하려고합니다.

insert into a_table (x1, x2) 
values (1,2), (3,4) 
on conflict do 
update set (x1, x2) = (1,2), (3,4); 

반면에

ERROR: syntax error at or near "3" 
LINE 4: update set (x1, x2) = (1,2), (3,4); 

를 얻을 수 psql의에서

create table a_table(id serial primary key, x1 int, x2 int); 

이 시도 테이블을 갖는, ON CONFLICT이 경우 이해되지 않는다. 사용 된 열 (또는 열 그룹)이 고유하지 않으므로 충돌이 발생하지 않습니다.

INSERT syntax을 확인하십시오. 자세한 내용은 UPSERT in wiki을 참조하십시오.

+0

그래서 열 x1과 x2가 함께 고유하다고한다면? 내가 테이블을 만들고 '충돌 (x1, x2) 할 때'와 같은 일을 할 때 어떻게 든 지정해야합니까? –

+0

실질적으로 여러 행을 삽입 할 때 (행 또는 열 그룹이 고유하다고 가정 할 때) 합리적인 방법은'충돌 '... 아무것도하지 말아야한다는 것입니다. 왜냐하면'update'는 여러 번 동일한 행에 영향을 줄 수 없기 때문입니다. 우연히 있다). – klin

0

1.before

enter image description here

2.command

enter image description here

3.after 삽입 삽입

enter image description here