J'ai le tableau de compteurs suivant:
CREATE TABLE cache (
key text PRIMARY KEY,
generation int
);
Je voudrais incrémenter l'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 dans SQL standard? L'opération fait parfois partie d'une transaction, parfois séparée.
Le SQL doit s'exécuter sans modification sur SQLite, PostgreSQL et MySQL, si possible.
Une recherche a donné plusieurs idées qui souffrent de problèmes de concurrence ou sont spécifiques à une base de données:
Essayez
INSERT
une nouvelle ligne etUPDATE
s'il y a eu 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 ligne.MySQL a une
ON DUPLICATE KEY UPDATE
clause.
EDIT: Merci pour toutes les bonnes réponses. Il semble que Paul a raison, et il n'y a pas un seul moyen portable de le faire. C'est assez surprenant pour moi, car cela ressemble à une opération très basique.