У меня есть следующая таблица счетчиков:
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: Спасибо за все замечательные ответы. Похоже, что Пол прав, и нет ни одного, портативного способа сделать это. Это удивительно для меня, поскольку это звучит как очень простая операция.