SQLite INSERT – MISE À JOUR DE LA CLÉ SUR DUPLICATE

MySQL a quelque chose comme ça:

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

Pour autant que je sache, cette fonctionnalité n’existe pas dans SQLite, ce que je veux savoir, c’est s’il existe un moyen d’archiver le même effet sans avoir à exécuter deux requêtes. Aussi, si ce n’est pas possible, que préférez-vous?

  1. SELECT + (INSERT ou UPDATE) ou
  2. UPDATE (+ INSERT si UPDATE échoue )

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

Cela nécessite que la colonne “ip” ait une contrainte UNIQUE (ou PRIMARY KEY).


EDIT: Une autre excellente solution: https://stackoverflow.com/a/4330694/89771 .

Je préférerais UPDATE (+ INSERT if UPDATE fails) . Moins de code = moins de bogues.

La réponse actuelle ne fonctionnera que dans sqlite OU mysql (selon que vous utilisez OU ou non). Donc, si vous voulez une compatibilité cross dbms, ce qui suit fera l’affaire …

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

Vous devez utiliser memcached car il s’agit d’une seule clé (l’adresse IP) stockant une seule valeur (le nombre de visites). Vous pouvez utiliser la fonction d’incrémentation atomique pour vous assurer qu’il n’y a pas de conditions de “course”.

C’est plus rapide que MySQL et enregistre la charge pour que MySQL puisse se concentrer sur d’autres choses.