ユーザーのアクティブ化が成功したかどうかに応じて、0または1を返すことになっているSQL関数があります。対話する必要がある次の2つのテーブルがあります。
users {user_id, unique email, ...}
user_activation {activation_hash, unique email, ...}
関数は以下を評価することになっています:
- 着信ハッシュはuser_activationの行と一致しますか?
- また、対応する電子メールはユーザーテーブルにまだ存在していませんか?
- 次に、新しいユーザーをユーザーに挿入し、アクティベーション行を削除して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 ;
私の問題は、条件が常にtrueと評価されることです(ただし、uniqueキーワードがなくてもユーザーテーブルに挿入される行は1つだけです)。
ありがとう。