我有以下计数器表:
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 是对的,而且没有一种单一的、可移植的方式来做到这一点。这让我很惊讶,因为这听起来像是一个非常基本的操作。