У меня есть следующая таблица счетчиков:
CREATE TABLE cache (
key text PRIMARY KEY,
generation int
);
Я хотел бы увеличить один из счетчиков или установить его на ноль, если соответствующая строка еще не существует. Есть ли способ сделать это без проблем concurrency в стандартном SQL? Операция иногда является частью транзакции, иногда отдельной.
SQL должен запускаться без изменений в SQLite, PostgreSQL и MySQL, если это возможно.
Поиск дал несколько идей, которые либо страдают от проблем concurrency, либо специфичны для базы данных:
-
Попробуйте
INSERTновую строку иUPDATE, если произошла ошибка. К сожалению, ошибка вINSERTпрерывает текущую транзакцию. -
UPDATEстрока, и если строки не были изменены,INSERTновая строка. -
MySQL имеет предложение
ON DUPLICATE KEY UPDATE.
EDIT: Спасибо за все замечательные ответы. Похоже, что Пол прав, и нет ни одного, портативного способа сделать это. Это удивительно для меня, поскольку это звучит как очень простая операция.