Mam następującą tabelę liczników:
CREATE TABLE cache (
key text PRIMARY KEY,
generation int
);
Chciałbym zwiększyć jeden z liczników lub ustawić go na zero, jeśli odpowiedni wiersz jeszcze nie istnieje. Czy można to zrobić bez problemów ze współbieżnością w standardowym języku SQL? Operacja jest czasami częścią transakcji, czasami oddzielną.
Jeśli to możliwe, SQL musi być niezmodyfikowany na SQLite, PostgreSQL i MySQL.
Wyszukiwanie przyniosło kilka pomysłów, które albo cierpią na problemy ze współbieżnością, albo są specyficzne dla bazy danych:
Spróbuj przejść
INSERT
do nowego wiersza, aUPDATE
jeśli wystąpił błąd. Niestety błąd przyINSERT
przerywaniu bieżącej transakcji.UPDATE
wiersz, a jeśli żadne wiersze nie zostały zmodyfikowane,INSERT
nowy wiersz.MySQL zawiera
ON DUPLICATE KEY UPDATE
klauzulę.
EDYCJA: Dzięki za wszystkie świetne odpowiedzi. Wygląda na to, że Paul ma rację i nie ma jednego, przenośnego sposobu na zrobienie tego. To dla mnie dość zaskakujące, ponieważ brzmi to jak bardzo podstawowa operacja.