J'ai le tableau de compteurs suivant :
CREATE TABLE cache (
key text PRIMARY KEY,
generation int
);
Je voudrais incrémenter un des compteurs, ou le mettre à zéro si la ligne correspondante n'existe pas encore. Existe-t-il un moyen de le faire sans problèmes de concurrence en SQL standard ? L'opération fait parfois partie d'une transaction, parfois elle est séparée.
Le SQL doit fonctionner sans modification sur SQLite, PostgreSQL et MySQL, si possible.
Une recherche a permis de trouver plusieurs idées qui souffrent de problèmes de concurrence ou qui sont spécifiques à une base de données :
-
Essayez de
INSERT
une nouvelle ligne, etUPDATE
s'il y avait une erreur. Malheureusement, l'erreur surINSERT
abandonne la transaction en cours. -
UPDATE
la ligne, et si aucune ligne n'a été modifiée,INSERT
une nouvelle rangée. -
MySQL dispose d'un
ON DUPLICATE KEY UPDATE
clause.
EDIT : Merci pour toutes ces réponses. Il semble que Paul ait raison, et qu'il n'y ait pas une seule façon portable de faire cela. C'est assez surprenant pour moi, car cela semble être une opération très basique.