sourcecode

SQLite INSERT - 중복 키 업데이트 시(UPSERT)

copyscript 2022. 9. 11. 17:29
반응형

SQLite INSERT - 중복 키 업데이트 시(UPSERT)

MySQL에는 다음과 같은 기능이 있습니다.

INSERT INTO visits (ip, hits)
VALUES ('127.0.0.1', 1)
ON DUPLICATE KEY UPDATE hits = hits + 1;

이 기능은 SQLite에 존재하지 않는 것으로 알고 있는데, 2개의 쿼리를 실행하지 않고도 동일한 효과를 얻을 수 있는 방법이 있는지 알고 싶습니다.또, 이것이 불가능한 경우는, 다음의 어느 것을 추천합니다.

  1. 선택 + (삽입 또는 업데이트) 또는
  2. 업데이트(+ 업데이트 실패 시 삽입)
INSERT OR IGNORE INTO visits VALUES ($ip, 0);
UPDATE visits SET hits = hits + 1 WHERE ip LIKE $ip;

이를 위해서는 "ip" 열에 고유(또는 Primary KEY) 제약 조건이 있어야 합니다.


편집: 또 하나의 뛰어난 솔루션: https://stackoverflow.com/a/4330694/89771.

3.24.0 SQLite는 업서트도 지원하므로 다음과 같이 간단하게 기술할 수 있습니다.

INSERT INTO visits (ip, hits)
VALUES ('127.0.0.1', 1)
ON CONFLICT(ip) DO UPDATE SET hits = hits + 1;

저는 더 좋아요UPDATE (+ INSERT if UPDATE fails). 코드 감소 = 버그 감소.

현재 응답은 sqlite OR mysql에서만 작동합니다(OR 사용 여부에 따라 다름).따라서 크로스 DBMS 호환성을 원한다면 다음과 같이 하면 됩니다.

REPLACE INTO `visits` (ip, value) VALUES ($ip, 0);

여기에는 단일 값(방문수)을 저장하는 단일 키(IP 주소)이므로 memcached를 사용해야 합니다.atomic increment 함수를 사용하여 "레이스" 조건이 없음을 확인할 수 있습니다.

MySQL보다 빠르고 부하를 줄여 MySQL이 다른 일에 집중할 수 있도록 합니다.

언급URL : https://stackoverflow.com/questions/2717590/sqlite-insert-on-duplicate-key-update-upsert

반응형