【问题标题】:Return value for ON CONFLICT DO NOTHING in PL/pgSQL functionPL/pgSQL 函数中 ON CONFLICT DO NOTHING 的返回值
【发布时间】:2022-01-19 14:40:44
【问题描述】:
按照this评论的指示。
CREATE OR REPLACE FUNCTION test_upsert(
_parent_id int,
_some_text text)
RETURNS text
LANGUAGE plpgsql AS
$func$
DECLARE
a text;
BEGIN
INSERT INTO parent_tree (parent_id, some_text)
VALUES (_parent_id,_some_text)
ON CONFLICT DO NOTHING
RETURNING 'ok' into a;
return a;
IF NOT FOUND THEN return 'JUZ ISTNIEJE';
END IF;
END
$func$;
-
不确定这是什么意思:
IF NOT FOUND THEN return 'JUZ ISTNIEJE';
-
如果没有冲突,则返回ok,这是有道理的。但是当发生冲突时,它将产生空值。是否可以同时拥有 on conflict do nothing 也返回 not ok 或者当发生冲突时,只返回 raise notice parent_id should be unique?
【问题讨论】:
标签:
postgresql
return-value
plpgsql
upsert
【解决方案1】:
我现在更新了my referenced answer 以修复一个错误,这似乎是造成混乱的主要原因。
- 不确定
IF NOT FOUND THEN return 'JUZ ISTNIEJE'; 是什么意思?
“JUZ ISTNIEJE”是波兰语,意为“已经存在”——这就是 OP 想要返回的内容。唯一的一点是返回一个有意义的文本,而不是什么都没有(NULL)——这似乎解决了你的下一个问题:
- 如果没有冲突,则返回
ok,这是有道理的。但是当发生冲突时,它将产生空值。是否可以同时拥有on conflict do nothing 并返回not ok 或者当发生冲突时,只需raise notice parent_id should be unique。
是的,这就是我在那边的回答所做的,现在它已经修复了。你的函数变成:
CREATE OR REPLACE FUNCTION test_upsert(_parent_id int, _some_text text)
RETURNS text
LANGUAGE plpgsql AS
$func$
BEGIN
INSERT INTO parent_tree (parent_id, some_text)
VALUES (_parent_id,_some_text)
ON CONFLICT DO NOTHING;
IF FOUND THEN
RETURN 'ok';
ELSE
RAISE NOTICE 'parent_id already exists: %', _parent_id; -- optional!
RETURN 'not ok'; -- or whatever
END IF;
END
$func$;