我想构造一个部分插入冲突更新语句,它可以为非空列取空值,只要更新的行具有值,这样就不会违反约束。在多列的情况下,我希望每一列都被更新,即使其中一个为空然后被忽略。
当使用
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
中。有什么办法可以做到这一点?