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