반응형
SQLite INSERT - 중복 키 업데이트 시(UPSERT)
MySQL에는 다음과 같은 기능이 있습니다.
INSERT INTO visits (ip, hits)
VALUES ('127.0.0.1', 1)
ON DUPLICATE KEY UPDATE hits = hits + 1;
이 기능은 SQLite에 존재하지 않는 것으로 알고 있는데, 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
반응형
'sourcecode' 카테고리의 다른 글
도커 컨테이너에 MariaDB 데이터가 남아 있는 이유는 무엇입니까?볼륨이 없습니다. (0) | 2022.09.11 |
---|---|
MariaDB 10.1 Json Get_string (0) | 2022.09.11 |
PHP에서 여러 생성자를 수행하는 가장 좋은 방법 (0) | 2022.09.11 |
컨테이너 재시작 문제, 목장의 Galera MariaDB 스택 (0) | 2022.09.11 |
멤버 변수에 대한 PHP 곱슬 괄호 구문 (0) | 2022.09.11 |