使用合并插入非空列时忽略单个空值

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

我想构造一个部分插入冲突更新语句,它可以为非空列取空值,只要更新的行具有值,这样就不会违反约束。在多列的情况下,我希望每一列都被更新,即使其中一个为空然后被忽略。

当使用

coalesce(excluded.value, table.value)
更新值时,我希望语句接受空值,因为将使用现有值,满足约束。但是,该语句以错误告终,指出违反了非空约束。

为了测试它,这里有一个 MWE:

CREATE TABLE test (id INT NOT NULL, val INT NOT NULL, PRIMARY KEY (id));
INSERT INTO test VALUES (0, 1);

INSERT INTO test
VALUES (0, 2)
ON CONFLICT (id)
DO UPDATE SET val=COALESCE(EXCLUDED.val, test.val);
SELECT * FROM test;

INSERT INTO test
VALUES (0, null)
ON CONFLICT (id)
DO UPDATE SET val=COALESCE(EXCLUDED.val, test.val);
SELECT * FROM test;

这是一个 SQL Fiddle 做同样的事。

所以我认为约束已经在

VALUES
中检查过了,而不是在
SET
中。有什么办法可以做到这一点?

sql postgresql upsert
© www.soinside.com 2019 - 2024. All rights reserved.