Postgresql函数:获取更新或插入行的id

Sli*_*nTN 6 postgresql function

我的 postgresql 数据库中有一个函数,如果存在则更新行,如果不存在则插入新行:

CREATE OR REPLACE FUNCTION insert_or_update(val1 integer, val2 integer) RETURNS VOID AS $$ 
DECLARE 
BEGIN 
    UPDATE my_table SET col2 = val2 WHERE col1 = val1; 
    IF NOT FOUND THEN 
    INSERT INTO my_table (col2) values ( val2 ); 
    END IF; 
END; 
$$ LANGUAGE 'plpgsql';
Run Code Online (Sandbox Code Playgroud)

目前它工作完美,但我想获取id行(如果更新或插入)。
我该怎么做?

小智 4

您的函数被声明为returns void因此它不能返回任何内容。

假设col1是主键并且也定义为序列,您可以执行以下操作:

CREATE OR REPLACE FUNCTION insert_or_update(val1 integer, val2 integer) 
    RETURNS int 
AS $$ 
DECLARE 
  l_id integer;
BEGIN 
    l_id := val1; -- initialize the local variable.

    UPDATE my_table 
       SET col2 = val2 
    WHERE col1 = val1; -- !! IMPORTANT: this assumes col1 is unique !!

    IF NOT FOUND THEN 
       INSERT INTO my_table (col2) values ( val2 ) 
       RETURNING col1 -- this makes the generated value available
       into l_id;     -- and this stores it in the local variable
    END IF; 

    return l_id; -- return whichever was used.
END; 
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

与您的功能相比,我改变了四件事:

  1. 该函数被声明为returns integer以便能够返回一些东西
  2. 您需要一个变量来存储语句的返回insert
  3. 最后需要返回生成的值:
  4. 语言名称是一个标识符,因此不能使用单引号引起来。

如果您想区分调用者的更新或插入,可以将 l_id 初始化为nullnull在这种情况下,如果发生更新,该函数将返回,否则返回某个值。