111 votes

SQLite UPSERT - SUR LA MISE À JOUR DE LA CLÉ EN DOUBLE

MySQL a quelque chose comme ça:

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

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. De plus, si cela n’est pas possible, que préférez-vous:

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

126voto

dan04 Points 33306
 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: http://stackoverflow.com/a/4330694/89771 .

19voto

codeholic Points 2726

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

9voto

Jacob Thomason Points 319

La réponse actuelle ne fonctionnera que dans sqlite OU mysql (selon que vous utilisiez ou non). Donc, si vous voulez une compatibilité croisée des dbms, voici ce qui va se passer ...

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

-4voto

Xeoncross Points 13263

Vous devez utiliser memcached pour cela puisqu'il s'agit d'une clé unique (l'adresse IP) stockant une valeur unique (le nombre de visites). Vous pouvez utiliser la fonction d’incrémentation atomique pour vous assurer qu’il n’y a pas de condition "raciale".

Il est plus rapide que MySQL et permet d’économiser la charge. MySQL peut se concentrer sur d’autres tâches.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X