PostgreSQL:测试用户是否存在否则创建新用户返回他的ID
PostgreSQL: test if user exists else create new user returning his id
我正在尝试创建满足以下条件的查询:
给定用户名和电子邮件地址,
- 测试用户名或电子邮件是否已被占用,如果没有,则插入 user_account(用户名,email_address,哈希)
- return(整数)
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 = AND email_address = )
THEN RETURN 3;
ELSEIF EXISTS(SELECT 0 FROM user_account WHERE username = )
THEN RETURN 1;
ELSEIF EXISTS(SELECT 0 FROM user_account WHERE email_address = )
THEN RETURN 2;
ELSE FOR id IN INSERT INTO user_account (username, email_address, hash) values (, , ) RETURNING user_id
LOOP
RETURN id;
END LOOP;
END IF;
RETURN 0;
END;
$body$
LANGUAGE plpgsql
VOLATILE
是否有更优雅的方法来实现此目的而无需经历声明记录和循环的麻烦?
您不需要循环,只需将 INSERT ... RETURNING
的结果存储到您的变量中即可;
declare
id integer; -- use an integer variable
begin
...
ELSE
INSERT INTO user_account (username, email_address, hash) values (, , )
RETURNING user_id
INTO id; --<< here
return id;
END IF;
end;
我正在尝试创建满足以下条件的查询:
给定用户名和电子邮件地址,
- 测试用户名或电子邮件是否已被占用,如果没有,则插入 user_account(用户名,email_address,哈希)
- return(整数)
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 = AND email_address = )
THEN RETURN 3;
ELSEIF EXISTS(SELECT 0 FROM user_account WHERE username = )
THEN RETURN 1;
ELSEIF EXISTS(SELECT 0 FROM user_account WHERE email_address = )
THEN RETURN 2;
ELSE FOR id IN INSERT INTO user_account (username, email_address, hash) values (, , ) RETURNING user_id
LOOP
RETURN id;
END LOOP;
END IF;
RETURN 0;
END;
$body$
LANGUAGE plpgsql
VOLATILE
是否有更优雅的方法来实现此目的而无需经历声明记录和循环的麻烦?
您不需要循环,只需将 INSERT ... RETURNING
的结果存储到您的变量中即可;
declare
id integer; -- use an integer variable
begin
...
ELSE
INSERT INTO user_account (username, email_address, hash) values (, , )
RETURNING user_id
INTO id; --<< here
return id;
END IF;
end;