【问题标题】:Postgres generate a unique usernamePostgres 生成一个唯一的用户名
【发布时间】:2020-11-03 01:30:19
【问题描述】:

我有一个需要生成唯一用户名的要求。我知道如何在服务器端执行此操作,但希望尽可能高效,并作为过程的一部分在数据库上执行此操作,但由于我不经常使用 SQL,因此不确定从哪里开始。

我希望能够使用他们的名字和姓氏的第一个字母加上一些数字来创建用户名,如果用户已经存在该用户名,则将其更新为 1。例如

我有用户

  • 鲍勃·琼斯 bjones1
  • 比尔·琼斯 bjones2

如果添加了用户 Beatrice Jones,那将是 bjones3。

但是用户可以选择他们的用户名,所以有人可能已经选择了 bjones3,所以我希望它自动生成 bjones4。

如果没有用户 B Jones,则创建的第一个用户名应该是 bjones

理想情况下,这一切都将作为用户插入数据库的一部分发生,因此我的 Go 代码只需执行一次数据库调用,用户就会被插入。

更新:

当用户选择自己的用户名时,我会检查它是否存在,如果存在则阻止他们使用。

【问题讨论】:

  • 澄清一下,如果 bjones 不存在,创建的用户名是 bjones00001 还是 bjones?
  • 但是用户可以选择自己的用户名:希望没有人选择user1 作为其用户名
  • 我想成为 bjones 会更有意义
  • 当您期望文本 + 固定大小的数字模式时,用户选择的数字可能会影响一些事情

标签: sql postgresql stored-procedures


【解决方案1】:

嗯。 . .我认为这样可以:

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}$';

Here 是一个 dbfiddle。

【讨论】:

  • 不应该搜索也使用正则表达式,以防止现有用户billy joneskt (bjoneskt1234)影响ID?
  • 好电话,JGH。除非您这样做,否则它无法正常工作。但是有一个缺点 - 如果存在,正则表达式搜索将击败 username 索引。
【解决方案2】:

更严格,参数化,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;

【讨论】:

    【解决方案3】:

    我用以下代码做了类似的事情:

    _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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-01
      • 2022-11-13
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      • 2014-03-09
      相关资源
      最近更新 更多