尽管存在检查,“重复键值违反了唯一约束”

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尽管存在检查,“重复键值违反了唯一约束”相关的知识,希望对你有一定的参考价值。

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

答案

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

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

不,它不是:它

在其他交易存在同样的事情时会失败...>

AFAIR的基本替代方案是insert - > exception - > update或在表级锁定

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

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

以上是关于尽管存在检查,“重复键值违反了唯一约束”的主要内容,如果未能解决你的问题,请参考以下文章

尽管记录不存在,但 SQL 主键约束

js代码片段

Python 向 Postman 请求代码片段

单击时检查表单中是不是存在不显示的元素

xml Eclipse模板(代码片段)检查参数并最终抛出IllegalArgumentException

尽管覆盖了 onSaveInstanceState,但片段的包在 onCreate 中为空