development

SQLite INSERT-ON DUPLICATE KEY UPDATE (UPSERT)

big-blog 2020. 9. 3. 23:28
반응형

SQLite INSERT-ON DUPLICATE KEY UPDATE (UPSERT)


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

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

이 기능이 SQLite에 존재하지 않는다는 것을 알고있는 한 제가 알고 싶은 것은 두 개의 쿼리를 실행하지 않고도 동일한 효과를 얻을 수있는 방법이 있는지 여부입니다. 또한 이것이 가능하지 않은 경우 선호하는 것은 무엇입니까?

  1. SELECT + (INSERT 또는 UPDATE) 또는
  2. UPDATE ( 업데이트가 실패하면 + INSERT )

3.24.0 이후 SQLite는 upsert도 지원 하므로 이제 다음과 같이 간단히 작성할 수 있습니다.

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

INSERT OR IGNORE INTO visits VALUES ($ip, 0);
UPDATE visits SET hits = hits + 1 WHERE ip LIKE $ip;

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


편집 : 또 다른 훌륭한 솔루션 : https://stackoverflow.com/a/4330694/89771 .


나는 선호한다 UPDATE (+ INSERT if UPDATE fails). 더 적은 코드 = 더 적은 버그.


현재 답변은 sqlite OR mysql에서만 작동합니다 (OR 사용 여부에 따라 다름). 따라서 dbms 간 호환성을 원하면 다음을 수행합니다.

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

단일 값 (방문 수)을 저장하는 단일 키 (IP 주소)이므로이를 위해 memcached를 사용해야합니다. 원자 증분 함수를 사용하여 "경주"조건이 없는지 확인할 수 있습니다.

MySQL보다 빠르며 부하를 줄여 MySQL이 다른 일에 집중할 수 있습니다.

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

반응형