행을 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;