【问题标题】:PostgreSQL: test if user exists else create new user returning his idPostgreSQL:测试用户是否存在,否则创建新用户返回他的 id
【发布时间】:2018-02-08 18:04:51
【问题描述】:

我正在尝试创建一个满足以下条件的查询:

给定用户名和电子邮件地址,

  • 测试用户名或电子邮件是否已被占用,如果没有,则 INSERT INTO user_account (username, email_address, hash)
  • 如果成功,则返回(作为整数)新用户的user_id,如果用户名已被占用,则返回-1,如果电子邮件地址已被占用,则返回-2,如果两者都被占用,则返回-3(或任何其他方式确定出错的原因)
  • 原子块
  • 最佳查询

到目前为止,我有以下功能:

CREATE OR REPLACE FUNCTION add_user
  (character varying(40), character varying(255), character(60))
RETURNS integer
AS $body$
DECLARE
  id record;
BEGIN
  IF EXISTS(SELECT 0 FROM user_account WHERE username = $1 AND email_address = $2)
  THEN RETURN 3;
  ELSEIF EXISTS(SELECT 0 FROM user_account WHERE username = $1)
  THEN RETURN 1;
  ELSEIF EXISTS(SELECT 0 FROM user_account WHERE email_address = $2)
  THEN RETURN 2;
  ELSE FOR id IN INSERT INTO user_account (username, email_address, hash) values ($1, $2, $3) RETURNING user_id
       LOOP
         RETURN id;
       END LOOP;
  END IF;
  RETURN 0;
END;
$body$
LANGUAGE plpgsql
VOLATILE

是否有更优雅的方式来实现这一点,而无需经历声明记录和循环的麻烦?

【问题讨论】:

    标签: sql postgresql plpgsql postgresql-9.1


    【解决方案1】:

    您不需要循环,只需将INSERT ... RETURNING 的结果存储到您的变量中即可;

    declare 
      id integer; -- use an integer variable
    begin
        ...
        ELSE 
           INSERT INTO user_account (username, email_address, hash) values ($1, $2, $3) 
           RETURNING user_id 
           INTO id; --<< here
           return id;
        END IF;
    end;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 2018-04-16
      • 2016-01-18
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 2013-08-14
      相关资源
      最近更新 更多