我有下表的计数器:
CREATE TABLE cache (
key text PRIMARY KEY,
generation int
);
我希望增加一个计数器,或者如果对应的行还不存在,则将其设置为零。在标准 SQL 中有没有不存在并发问题的方法?操作有时是事务的一部分,有时是独立的。
SQL 必须在 SQLite、 PostgreSQL 和 MySQL 上运行,如果可能的话。
通过搜索,我们得到了一些想法,这些想法要么存在并发性问题,要么是特定于数据库的:
尝试将 INSERT
设置为一个新行,如果出现错误,则设置为 UPDATE
。遗憾的是,INSERT
上的错误将中止当前事务。
UPDATE
行,如果没有行被修改,INSERT
一个新的行。
MySQL 有一个 ON DUPLICATE KEY UPDATE
子句。
编辑: 感谢所有伟大的回复。看起来 Paul 是对的,并且没有一种单一的,可移植的方法来做这件事。这让我很惊讶,因为这听起来像是一个非常基本的手术。