插入或选择后返回id

Roc*_*nja 4 postgresql insert concurrency plpgsql postgresql-9.3

我想构建一个函数,如果表中不存在电子邮件值并返回email_id行的值,则该函数将插入电子邮件。我怎样才能做到这一点?
另外,如果电子邮件没有插入并且它已经存在于数据库中,我该如何返回 ID?我需要执行另一个SELECT吗?

BEGIN;
  LOCK TABLE mailing_list IN SHARE ROW EXCLUSIVE MODE;
  INSERT INTO mailing_list (email)
  SELECT 'email'
   WHERE NOT EXISTS (
     SELECT * FROM mailing_list WHERE email='email'
   );
COMMIT;
Run Code Online (Sandbox Code Playgroud)

我试过添加,returning id但它不起作用。我有:

查询没有结果数据的目的地

Sqlfiddle

a_h*_*ame 7

您需要将要返回的值存储在某处:

CREATE OR REPLACE FUNCTION f_get(ikey text)
  returns integer
  AS
$func$
DECLARE 
  l_id integer;
BEGIN
  LOCK TABLE foo IN SHARE ROW EXCLUSIVE MODE;
  INSERT INTO foo (type)
  SELECT ikey
   WHERE NOT EXISTS (
     SELECT * FROM foo WHERE type=ikey
   )
   returning id into l_id; --< store the returned ID in local variable
   return l_id; --< return this variable
END
$func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

您也可以使用原始函数和OUT参数完成此操作。在这种情况下,您只需要使用returning id into out_key;