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'obtenir le même effet sans avoir à exécuter deux requêtes. De plus, si cela n’est pas possible, que préférez-vous:
Depuis la version 3.24.0, SQLite prend également en charge upsert , vous pouvez donc simplement écrire ce qui suit:
INSERT INTO visits (ip, hits)
VALUES ('127.0.0.1', 1)
ON CONFLICT(ip) DO UPDATE SET hits = hits + 1;
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 bonne solution: https://stackoverflow.com/a/4330694/89771 .
Je préférerais UPDATE (+ INSERT if UPDATE fails)
. Moins de code = moins de bugs.
La réponse actuelle ne fonctionnera que dans sqlite OR mysql (selon que vous utilisiez OR ou pas). Donc, si vous voulez une compatibilité croisée entre les bases de données, ça ira...
REPLACE INTO `visits` (ip, value) VALUES ($ip, 0);