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