“没有与冲突匹配的唯一或排除约束”,输入与复合键之一匹配[重复]

问题描述 投票:0回答:1

我有一张看起来像这样的桌子:

CREATE TABLE IF NOT EXISTS list (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  tok TEXT,
  sid TEXT NOT NULL,
  aid TEXT,
  hash TEXT,
  qtt SMALLINT,
  p DECIMAL,

  UNIQUE (tok, sid, aid),
  UNIQUE (sid, qtt, hash)
);

我想用node-pg创建一个动态插入函数,大致如下所示:

INSERT (tok, sid, aid, qtt, hash, p)
VALUES ($1, $2, $3, $4, $5, $6)
ON CONFLICT (tok, sid, aid, qtt, hash)
DO UPDATE SET p = $6;

当我尝试插入

(NULL, string, NULL, int, string, decimal)
的值(与组合键之一匹配的值)时,它会抛出此错误:

错误:没有与 ON CONFLICT 规范相匹配的唯一或排除约束。

我该如何处理插入或约束才能使其正常工作,同时又保持其动态的单查询解决方案?

node.js postgresql node-postgres
1个回答
0
投票

DO UPDATE
变体适用于单个“冲突目标”。 说明书:

对于

ON CONFLICT DO NOTHING
,可以选择指定
conflict_target
;省略时,将处理与所有可用约束(和唯一索引)的冲突。对于
ON CONFLICT DO UPDATE
,必须提供
conflict_target

你问:

如何检查这两个约束?

您可以使用

ON CONFLICT ... DO NOTHING
“检查”,它处理所有约束,包括您提到的两个。

尚不明确,如果发生冲突,您想要更新什么。以及是否是单行UPSESRT,以及是否存在并发、可能冲突的写入...

对于单个输入行,并且没有并发写入:

WITH single_input( ... ) AS (
   SELECT  ...
   )
, ins AS (
   INSERT INTO list ( ... ) 
   SELECT * FROM single_input
   ON CONFLICT DO NOTHING
   RETURNING id
   )
UPDATE list
SET    ? = s.?
FROM   single_input s
WHERE  NOT EXISTS (TABLE ins);

相关:

© www.soinside.com 2019 - 2024. All rights reserved.