我试图确定我应该使用的确切语法与CASE一起进行ON CONFLIC。
我有一张桌子(忽略id
,这里没有关系):
CREATE TABLE public.test (
id integer NOT NULL,
mykey integer,
t text,
);
约束条件mykey
必须是唯一的
ALTER TABLE test
ADD CONSTRAINT test_constraint UNIQUE (mykey);
让我们用一些播放条目填充它:
INSERT INTO test (mykey,t) VALUES (123,'my first value');
INSERT INTO test (mykey,t) VALUES (13,'second value');
现在我想制作一个使用ON CONFLICT和CASE的INSERT语句,以便:如果t
的新值等于旧值,则不执行任何操作,否则更新。
这是我到目前为止所拥有的:
INSERT INTO test (mykey,t) VALUES (123,'a new value')
ON CONFLICT ON CONSTRAINT test_constraint
DO CASE t
WHEN excluded.t THEN NOTHING
ELSE UPDATE SET t=excluded.t;
END;
我收到一条错误消息
ERROR: syntax error at or near "case"
LINE 3: do case t
^
WARNING: there is no transaction in progress
我收到错误消息并不奇怪,因为如果我在第一次尝试时得到即兴声明,那会不会很奇怪? ;-)
但是,应该可以这样做(假设语法正确),或其他相同的效果。我知道如何做冲突没事,冲突更新,以及案例/时间/过程。应该可以将它们全部一起使用。
编辑:我将更新我尝试过但没有工作的变化
INSERT INTO test (mykey,t) VALUES (123,'a new value')
ON CONFLICT ON CONSTRAINT test_constraint
CASE t
WHEN excluded.t THEN DO NOTHING
ELSE DO UPDATE SET t=excluded.t;
END;
(同样的错误)
您可以在qazxsw poi子句中使用条件。 qazxsw poi做了比较
WHERE
IS DISTINCT FROM