SQLite INSERT - ON DUPLICATE KEY UPDATE (UPSERT)
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:
- SELECT + (INSERT o UPDATE) o
- UPDATE (+ INS Se l'aggiornamento non riesce )
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.