Postgres сгенерировать уникальное имя пользователя - PullRequest
0 голосов
/ 13 июля 2020

У меня есть требование, по которому мне нужно создать уникальные имена пользователей. Я знаю, как бы это сделать на стороне сервера, но хочу сделать это как можно более эффективным и делать это в базе данных как часть процедуры, но не знаю, с чего начать, поскольку я не слишком часто работаю с SQL.

Я хочу иметь возможность создать имя пользователя, используя первую букву его имени и его фамилию плюс некоторые числа, и если пользователь уже существует с этим именем пользователя, обновите его на 1. например,

У меня есть пользователи

  • Bob Jones bjones1
  • Bill Jones bjones2

Если добавить пользователя Beatrice Jones, то это будет bjones3.

Однако пользователи могут выбрать свое имя пользователя, так что кто-то, возможно, уже выбрал bjones3, поэтому я хочу, чтобы он автоматически генерировал bjones4.

Если нет пользователя B Jones, то первое созданное имя пользователя должно быть bjones

В идеале все это должно происходить как часть вставки пользователем в базу данных, поэтому мой код Go просто выполняет один вызов базы данных, и пользователь вставляется.

Обновление:

Когда пользователь выбирает собственное имя пользователя, я проверяю, существует ли оно, и блокирую его использование, если оно существует.

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Более строгий и параметризованный, с 4-мя git порядковым номером.

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;
1 голос
/ 13 июля 2020

Хммм. . . Думаю, это подойдет:

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

Здесь - скрипка db <>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...