尽管存在检查

时间:2017-07-13 18:01:45

标签: sql postgresql duplicates postgresql-9.4 upsert

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功能,这样的单个语句怎么可能以这种方式失败? (这可以避免吗?)

1 个答案:

答案 0 :(得分:1)

https://www.postgresql.org/message-id/8316.1296788047%40sss.pgh.pa.us

  

Re:是不是“插入不存在的地方”原子?

     

不,不是:它

     

在其他交易存在的情况下失败...>

     

AFAIR基本替代品是插入 - >例外 - >   更新或锁定表级

(引用非常不准确 - 强烈建议阅读帖子)

如果我在9.5 upsert之前理解Toms指令,那么唯一的选择就是插入,如果是异常更新或其他什么......