Ich habe die folgende Tabelle von Zählern:
CREATE TABLE cache (
key text PRIMARY KEY,
generation int
);
Ich möchte einen der Zähler erhöhen oder auf Null setzen, wenn die entsprechende Zeile noch nicht vorhanden ist. Gibt es eine Möglichkeit, dies ohne Parallelitätsprobleme in Standard-SQL zu tun? Die Operation ist manchmal Teil einer Transaktion, manchmal getrennt.
Wenn möglich, muss SQL unter SQLite, PostgreSQL und MySQL unverändert ausgeführt werden.
Eine Suche ergab mehrere Ideen, die entweder unter Parallelitätsproblemen leiden oder für eine Datenbank spezifisch sind:
Versuchen Sie es mit
INSERT
einer neuen Zeile, undUPDATE
wenn ein Fehler aufgetreten ist. LeiderINSERT
bricht der Fehler bei die aktuelle Transaktion ab.UPDATE
die Zeile, und wenn keine Zeilen geändert wurden,INSERT
eine neue Zeile.MySQL hat eine
ON DUPLICATE KEY UPDATE
Klausel.
EDIT: Danke für all die tollen Antworten. Es sieht so aus, als ob Paul Recht hat, und es gibt keinen einzigen tragbaren Weg, dies zu tun. Das ist für mich ziemlich überraschend, da es sich nach einer sehr einfachen Operation anhört.