【问题标题】: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$;
  1. 不确定这是什么意思:

    IF NOT FOUND THEN return 'JUZ ISTNIEJE';

  2. 如果没有冲突,则返回ok,这是有道理的。但是当发生冲突时,它将产生空值。是否可以同时拥有 on conflict do nothing 也返回 not ok 或者当发生冲突时,只返回 raise notice parent_id should be unique

【问题讨论】:

    标签: postgresql return-value plpgsql upsert


    【解决方案1】:

    我现在更新了my referenced answer 以修复一个错误,这似乎是造成混乱的主要原因。

    1. 不确定IF NOT FOUND THEN return 'JUZ ISTNIEJE'; 是什么意思?

    “JUZ ISTNIEJE”是波兰语,意为“已经存在”——这就是 OP 想要返回的内容。唯一的一点是返回一个有意义的文本,而不是什么都没有(NULL)——这似乎解决了你的下一个问题:

    1. 如果没有冲突,则返回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$;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-20
      • 1970-01-01
      • 2018-08-02
      • 2012-08-16
      • 2021-11-02
      • 2012-08-05
      相关资源
      最近更新 更多