postgres生成唯一的用户名

ugmeyewa  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(319)

我有一个需求,我需要生成唯一的用户名。我知道如何在服务器端执行,但希望尽可能提高效率,并将其作为过程的一部分在数据库中执行,但不确定从何处开始,因为我不太经常使用sql。
我想能够创建一个用户名使用他们的名字和姓氏的第一个字母加上一些数字,如果用户已经存在与该用户名,然后更新1。例如
我有用户
鲍勃·琼斯·比约内1
比尔·琼斯·比约内斯2
如果添加了用户beatrice jones,那么将是bjones3。
但是,用户可以选择自己的用户名,因此有人可能已经选择了bjones3,所以我希望它自动生成bjones4。
如果没有用户bjones,那么创建的第一个用户名应该是bjones
理想情况下,这一切都会作为用户插入数据库的一部分发生,所以我的go代码只执行一个数据库调用,用户就被插入了。
更新:
当用户选择自己的用户名时,我会检查用户名是否存在,如果存在,我会阻止他们使用。

wnrlj8wa

wnrlj8wa1#

嗯。我想这样可以:

select 'bjones' || coalesce(lpad( ((regexp_match(max(username), '[0-9]+$'))[1]::int + 1)::text, 5, '0'), '00000')
from t
where username ~ '^bjones[0-9]{5}$';

这是一把小提琴。

sxpgvts3

sxpgvts32#

更严格和参数化,具有4位序列号。

with 
unp as -- user name prefix
(select left(lower(:givenname), 1) || lower(:surname) unp),
maxno as -- max existing seq.number for this username prefix
(
    select coalesce(max((regexp_match(username, '(\d+)$'))[1]::integer), 0) maxno 
    from usernames
    where username ~ ('^'||(select unp from unp)||'\d+$')
)   
select (select unp from unp) || to_char((select maxno + 1 from maxno), 'FM0009')  username;
olhwl3o2

olhwl3o23#

我对以下代码做了类似的操作:

_username = left(lower(_firstname), 1) || lower(_lastname);
PERFORM id FROM users WHERE username = _username;
IF FOUND THEN
  FOR i in 1 .. 999
  LOOP
    _username := _username || i;
    PERFORM id FROM users WHERE username = _username;
    IF NOT FOUND THEN
      EXIT;
    END IF;
  END LOOP;
END IF;

相关问题