web-dev-qa-db-fra.com

SQLite INSERT - ON DUPLICATE KEY UPDATE (UPSERT)

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:

  1. SELECT + (INSERT ou UPDATE) ou
  2. PDATE (+ INSERT ) si UPDATE échoue )
89
Alix Axel

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;
12
szmate1618
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 .

113
dan04

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

18
codeholic

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);
7
Jacob Thomason