我有以下计数器表:
CREATE TABLE cache (
key text PRIMARY KEY,
generation int
);
我想增加其中一个计数器,或者如果相应的行尚不存在,则将其设置为零。有没有办法在标准 SQL 中没有并发问题的情况下做到这一点?该操作有时是事务的一部分,有时是单独的。
如果可能的话,SQL 必须在 SQLite、PostgreSQL 和 MySQL 上运行且未经修改。
搜索产生了几个想法,这些想法要么受到并发问题的困扰,要么特定于数据库:
Try to INSERT
一个新行,以及UPDATE
如果有错误。不幸的是,错误INSERT
中止当前事务。
UPDATE
行,如果没有行被修改,INSERT
一个新行。
MySQL 有一个ON DUPLICATE KEY UPDATE
clause.
编辑:感谢所有精彩的回复。看来保罗是对的,而且没有一种单一的、可移植的方法可以做到这一点。这让我感到非常惊讶,因为这听起来像是一个非常基本的操作。
MySQL(以及随后的 SQLite)也支持 REPLACE INTO 语法:
REPLACE INTO my_table (pk_id, col1) VALUES (5, '123');
这会自动识别主键并查找要更新的匹配行,如果未找到则插入新行。
文档:https://dev.mysql.com/doc/refman/8.0/en/replace.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)