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