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ść
INSERTdo nowego wiersza, aUPDATEjeśli wystąpił błąd. Niestety błąd przyINSERTprzerywaniu bieżącej transakcji.UPDATEwiersz, a jeśli żadne wiersze nie zostały zmodyfikowane,INSERTnowy wiersz.MySQL zawiera
ON DUPLICATE KEY UPDATEklauzulę.
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.