我有一张看起来像这样的桌子:
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 规范相匹配的唯一或排除约束。
我该如何处理插入或约束才能使其正常工作,同时又保持其动态的单查询解决方案?
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);
相关: