복붙노트

[SQL] SQLite는 INSERT - ON DUPLICATE KEY UPDATE (UPSERT)

SQL

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. ==============================

    1.3.24.0 SQLite는 또한 upsert를 지원하기 때문에, 이제 당신은 단순히 다음을 쓸 수 있습니다

    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;
    
  2. ==============================

    2.

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

    이것은 UNIQUE (또는 PRIMARY KEY) 제약 조건을 가지고있는 "IP"열이 필요합니다.

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

  3. ==============================

    3.(UPDATE가 실패 할 경우 + INSERT) 나는 UPDATE를 원합니다. 적은 코드 = 적은 버그.

    (UPDATE가 실패 할 경우 + INSERT) 나는 UPDATE를 원합니다. 적은 코드 = 적은 버그.

  4. ==============================

    4.현재의 대답은 (당신이 또는 사용 여부를 경우에 따라) sqlite가 또는 MySQL의에서 작동합니다. 당신은 크로스 DBMS 호환성을 원한다면, 다음이 할 것입니다 ...

    현재의 대답은 (당신이 또는 사용 여부를 경우에 따라) sqlite가 또는 MySQL의에서 작동합니다. 당신은 크로스 DBMS 호환성을 원한다면, 다음이 할 것입니다 ...

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

    5.이 단일 값 (방문 횟수)를 저장하는 하나의 키 (IP 주소)이기 때문에이에 대한 memcached를 사용해야합니다. 당신은 더 "경쟁"조건이없는 보장하기 위해 원자 증가 기능을 사용할 수 있습니다.

    이 단일 값 (방문 횟수)를 저장하는 하나의 키 (IP 주소)이기 때문에이에 대한 memcached를 사용해야합니다. 당신은 더 "경쟁"조건이없는 보장하기 위해 원자 증가 기능을 사용할 수 있습니다.

    그것은 빠른 MySQL을보다 더 그리고 MySQL은 다른 일에 집중할 수 있도록 부하를 저장합니다.

  6. from https://stackoverflow.com/questions/2717590/sqlite-insert-on-duplicate-key-update-upsert by cc-by-sa and MIT license