2017-02-12 1 views
0

저는 Postgres 9.6을 사용하고 있습니다. 레코드를 갱신하고 싶은 경우는 에 대해서는가 다릅니다 만, 같지 않으면 그대로 둡니다. 나는 정확히 같은 값, 나는 두 개의 레코드에서 얻을으로 두 번 실행하는 경우, 그러나Postgres UPSERT - 모든 데이터가 동일하면 업데이트하지 않습니까?

query = "INSERT INTO cap(scheme, year, code) " 
query += "VALUES(%s, %s, %s) " 
query += "ON CONFLICT DO NOTHING" 
cursor.execute(query, ('abc', 2015, 'twu')) 

:

은 (psycopg2를 통해 실행) 약간 내 테이블이 실제로 더 많은 필드를 가지고 있기 때문에 간단하게 내 SQL입니다 데이터베이스

정확히 같은 값을 제공해도 새 레코드가 생성되지 않도록 어떻게이 쿼리를 수정할 수 있습니까?

나는 ON CONFLICT UPDATE documentation을 읽으려고했지만 내 경우에 맞게 조정하는 방법을 모르겠습니다. 특히 DO NOTHING은 행을 삽입하면 안됩니다. (: "NO CONVERICT ON NOTHING은 단순히 행을 대체 액션으로 삽입하지 않습니다") 행을 삽입하지만 새로운 행을 삽입합니다.

+0

해당 테이블에 대해 기본 또는 고유 키가 정의되어 있습니까? 귀하의 질문을 편집하고'cap '테이블에 대한 완전한 create table 명령문을 추가하십시오 (모든 인덱스 포함) –

답변

3

INSERT ... ON CONFLICT ...은 충돌을 잡기 위해 고유 한 제약 조건이 필요합니다. 이 쿼리

INSERT INTO cap(scheme, year, code) 
VALUES('abc', 2015, 'twu') 
ON CONFLICT DO NOTHING 

의 고유 제한 조건 여러 실행으로

create table cap(
    scheme text, 
    year int, 
    code text, 
    unique(scheme, year, code) -- ! added 
); 

한 번만 행을 삽입합니다.

관련 문제