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