我有一个 SQL 函数,它应该根据用户激活是否成功返回 0 或 1。我有以下两个需要与之交互的表:
users {user_id, unique email, ...}
user_activation {activation_hash, unique email, ...}
该函数应该评估:
- 传入的哈希是否与 user_activation 中的一行匹配?
- 用户表中是否不存在相应的电子邮件?
- 然后在 users 中插入一个新用户并删除激活行并返回 1,否则返回 0
这是我的功能:
delimiter #
create function activate_user
(
p_activation_hash char(32)
)
returns int
deterministic
begin
if not exists (
select 1 from users u
inner join (
select email from user_activation where activation_hash = p_activation_hash
) ua
on u.email = ua.email
)
then
-- hash exists but email doesnt so add
insert into users (email, password_hash, first_name, last_name, company_name)
select email, password_hash, first_name, last_name, company_name
from user_activation
where activation_hash = p_activation_hash
and expiry_date > now();
-- delete the activation row(s)
delete low_priority from user_activation where activation_hash = p_activation_hash;
return 1;
end if;
return 0;
end #
delimiter ;
我的问题是条件总是评估为真(尽管即使没有唯一关键字,也只有 1 行被插入到用户表中)。
谢谢。