On PostgreSQL 9.4。
我很惊讶地看到我们的服务器日志中的错误,精确定位到pl / pgsql函数中的唯一语句:
CREATE OR REPLACE FUNCTION my_upsert(
intype text,
invalue text)
RETURNS void AS
$BODY$
BEGIN
WITH upsert AS
(
UPDATE mytable
SET count = count + 1
WHERE type = inType
AND value = inValue
RETURNING *
)
INSERT INTO mytable
(
value,
type
)
SELECT inValue, inType WHERE NOT EXISTS (SELECT * FROM upsert);
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
除非升级到9.5,所以我们可以使用内置的upsert功能,这样的单个语句怎么可能以这种方式失败? (这可以避免吗?)
答案 0 :(得分:1)
https://www.postgresql.org/message-id/8316.1296788047%40sss.pgh.pa.us
Re:是不是“插入不存在的地方”原子?
不,不是:它
将在其他交易存在的情况下失败...>
AFAIR基本替代品是插入 - >例外 - > 更新或锁定表级
(引用非常不准确 - 强烈建议阅读帖子)
如果我在9.5 upsert
之前理解Toms指令,那么唯一的选择就是插入,如果是异常更新或其他什么......