Рассчитать (не хранить) состояние приложения
Возможно, вам не следует хранить состояние приложения в таких базах данных. Вы вычисляете состояние приложения.
Рассмотрите возможность использования последовательных данных вместо попытки обновить состояние.
Учтите, что событие даже отмена - это новая ревизия.
item_id | revision
---------+----------
250 | 1
250 | 2
199 | 1
40 | 1
40 | 2
40 | 3
Или добавьте метки времени для каждой ревизии, как показано ниже.
item_id | revision | timestamp
---------+----------+-------------------------
250 | 1 | 2019-10-16 07:22:00-05
Затем создайте таблицу следующим образом:
CREATE TABLE items (item_id INT NOT NULL, revision INT NOT NULL, *...*, UNIQUE (item_id,revision));
Выберите, используя что-то вродеthis:
SELECT * FROM items ORDER BY revision DESC LIMIT 1
Другой вариант - проверить состояние до и после вставки.
Состояние проверки вручную
Вы можете указать, что item_id и revision поля UNIQUE , но это не то, что вы хотите. Похоже, вы хотите, чтобы поле is_newest_rev дублировалось для true значений.
Я считаю, что вы должны написать оператор SELECT или COUNT и проверьте его значение перед выполнением вставки. Вероятно, вы захотите сделать это и после слов, если несколько процессов одновременно обращаются к базе данных.
SELECT COUNT(*) FROM items WHERE item_id = 40 AND is_newest_rev = 't';
Если счет>> 1, не вставляйте. Но, кроме того, я не верю, что большинство SQL допускают тип ограничений сущностей, которые вы ищете.