PostgreSQL 函数 : get id of updated or inserted row

标签 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';

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

最佳答案

您的函数被声明为 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;

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

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

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

关于PostgreSQL 函数 : get id of updated or inserted row,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30233496/

相关文章:

python - 使用一列不同行中的值作为不同列中的值,但只有一行

oracle - 如何使用 TOAD ORACLE 调用包 DEF 中定义的 sql 函数 ABC

php - 在 Wordpress 中编辑 CSS 媒体查询

javascript - 使用 'arguments' 作为单独的参数调用函数

javascript - 简单的页面过滤功能

linux - 如何将函数的输出分配给 bash 中的变量?

sql - 将存储在 NoSQL DB 中的数据与存储在 SQL DB 中的数据相关联

arrays - PostgreSQL:对数组中的所有项目选择一个函数

postgresql - 如何避免在 postgresql 中重复长子查询?

ruby-on-rails - 选择不同的 rails 4.2.5 不能正常工作