[postgresql] 충돌 업데이트에 PostgreSQL INSERT ON (업소 트) 제외 된 모든 값 사용

행을 upserting 할 때 (PostgreSQL> = 9.5) 가능한 INSERT가 가능한 UPDATE와 정확히 동일하게하려면 다음과 같이 작성할 수 있습니다.

INSERT INTO tablename (id, username, password, level, email)
                VALUES (1, 'John', 'qwerty', 5, 'john@mail.com')
ON CONFLICT (id) DO UPDATE SET
  id=EXCLUDED.id, username=EXCLUDED.username,
  password=EXCLUDED.password, level=EXCLUDED.level,email=EXCLUDED.email

더 짧은 방법이 있습니까? 말하자면 : 모든 EXCLUDE 값을 사용하십시오.

SQLite에서는 다음과 같이했습니다.

INSERT OR REPLACE INTO tablename (id, user, password, level, email)
                        VALUES (1, 'John', 'qwerty', 5, 'john@mail.com')



답변

Postgres는에 해당하는 것을 구현하지 않았습니다 INSERT OR REPLACE. 로부터 ON CONFLICT문서 (강조 광산) :

DO NOTHING이거나 충돌시 수행 할 UPDATE 조치 의 정확한 세부 사항 을 지정하는 DO UPDATE 절일 수 있습니다 .

교체에 대한 단축은 아니지만 ON CONFLICT DO UPDATE기존 데이터를 기반으로 새 값을 설정할 수 있으므로보다 일반적으로 적용됩니다. 예를 들면 다음과 같습니다.

INSERT INTO users (id, level)
VALUES (1, 0)
ON CONFLICT (id) DO UPDATE
SET level = users.level + 1;


답변