SQLite INSERT – ON DUPLICATE KEY UPDATE

MySQL ha qualcosa del genere:

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

Per quanto ne so, questa caratteristica non esiste in SQLite, quello che voglio sapere è se c’è un modo per archiviare lo stesso effetto senza dover eseguire due query. Inoltre, se questo non è ansible, cosa preferisci:

  1. SELECT + (INSERT o UPDATE) o
  2. UPDATE (+ INSERT se UPDATE fallisce )

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

Ciò richiede che la colonna “ip” abbia un vincolo UNIQUE (o PRIMARY KEY).


EDIT: un’altra grande soluzione: https://stackoverflow.com/a/4330694/89771 .

Preferirei UPDATE (+ INSERT if UPDATE fails) . Meno codice = meno bug.

La risposta attuale funzionerà solo in sqlite O mysql (a seconda se usi OR o meno). Quindi, se vuoi una compatibilità con dbms cross, quanto segue farà …

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

È necessario utilizzare memcached per questo poiché è una singola chiave (l’indirizzo IP) che memorizza un singolo valore (il numero di visite). È ansible utilizzare la funzione di incremento atomico per assicurare che non vi siano condizioni di “gara”.

È più veloce di MySQL e salva il carico in modo che MySQL possa concentrarsi su altre cose.