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
INSERTeiner neuen Zeile, undUPDATEwenn ein Fehler aufgetreten ist. LeiderINSERTbricht der Fehler bei die aktuelle Transaktion ab.UPDATEdie Zeile, und wenn keine Zeilen geändert wurden,INSERTeine neue Zeile.MySQL hat eine
ON DUPLICATE KEY UPDATEKlausel.
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.