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