Domanda

MySQL ha qualcosa di simile:

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

Per quanto ne so questa funzione non esiste in SQLite, quello che voglio sapere è se c'è qualche modo per achive lo stesso effetto senza dover eseguire due query. Inoltre, se questo non è possibile, che cosa preferisci:

  1. SELECT + (INSERT o UPDATE) o
  2. UPDATE (+ INS Se l'aggiornamento non riesce )
È stato utile?

Soluzione

Dal 3.24.0 SQLite supporta anche upsert , così ora si può semplicemente scrivere la seguente

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

Altri suggerimenti

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

Questo richiede la colonna "ip" di avere un unico (o PRIMARY KEY) vincolo.


EDIT: Un altro grande soluzione:. https://stackoverflow.com/a/4330694/89771

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

La risposta attuale funziona solo in SQLite o MySQL (a seconda se si utilizza OR o no). Quindi, se si desidera che la compatibilità DBMS croce, quanto segue farà ...

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

Si dovrebbe utilizzare memcached per questo in quanto si tratta di un solo tasto (l'indirizzo IP) memorizzare un singolo valore (il numero di visite). È possibile utilizzare la funzione di incremento atomica per assicurare non ci sono le condizioni "razza".

E 'più veloce di MySQL e salva il carico in modo MySQL può concentrarsi su altre cose.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top