自动为用户生成唯一昵称
Generate unique nickname for user automatically
我需要生成唯一的昵称,其中包含用户的名字和一些预定义形容词的随机词。由于用户的名字和形容词的非唯一组合,可能会发生冲突。如何避免碰撞?我想在生成的序列中添加增量后缀,例如 amused-alex
、amused-alex-1
、amused-alex-2
、...、amused-alex-n
.
我的想法是创建额外的 table 包含所有已使用的名称:
nickname
count
amused-alex
2
bionic-john
1
所以 amused-alex
的下一次碰撞会有像 amused-alex-3
这样的昵称。或许有一些更优化的方案来解决此类问题?
我相信您只需要一个 serial
列就可以对昵称别名进行排序。
示例:
create table users_test(nickname varchar,nick_id serial);
insert into users_test values ('amused-alex');
insert into users_test values ('amused-alex');
insert into users_test values ('good-joe');
insert into users_test values ('good-joe');
insert into users_test values ('good-joe');
现在 users_test
包含五行
nickname | nick_id
-------------+---------
amused-alex | 1
amused-alex | 2
good-joe | 3
good-joe | 4
good-joe | 5
(5 rows)
通过以下查询,您可以生成始终不同的昵称。
select nickname, nick_id, nickname ||'-' ||rank() over (partition by nickname order by nick_id asc) nickname_unique from users_test;
nickname | nick_id | nickname_unique
-------------+---------+-----------------
amused-alex | 1 | amused-alex-1
amused-alex | 2 | amused-alex-2
good-joe | 3 | good-joe-1
good-joe | 4 | good-joe-2
good-joe | 5 | good-joe-3
(5 rows)
查询正在 nick_id
序列列上使用 RANK
函数。这样可以确保永远不会发生碰撞。
我需要生成唯一的昵称,其中包含用户的名字和一些预定义形容词的随机词。由于用户的名字和形容词的非唯一组合,可能会发生冲突。如何避免碰撞?我想在生成的序列中添加增量后缀,例如 amused-alex
、amused-alex-1
、amused-alex-2
、...、amused-alex-n
.
我的想法是创建额外的 table 包含所有已使用的名称:
nickname | count |
---|---|
amused-alex | 2 |
bionic-john | 1 |
所以 amused-alex
的下一次碰撞会有像 amused-alex-3
这样的昵称。或许有一些更优化的方案来解决此类问题?
我相信您只需要一个 serial
列就可以对昵称别名进行排序。
示例:
create table users_test(nickname varchar,nick_id serial);
insert into users_test values ('amused-alex');
insert into users_test values ('amused-alex');
insert into users_test values ('good-joe');
insert into users_test values ('good-joe');
insert into users_test values ('good-joe');
现在 users_test
包含五行
nickname | nick_id
-------------+---------
amused-alex | 1
amused-alex | 2
good-joe | 3
good-joe | 4
good-joe | 5
(5 rows)
通过以下查询,您可以生成始终不同的昵称。
select nickname, nick_id, nickname ||'-' ||rank() over (partition by nickname order by nick_id asc) nickname_unique from users_test;
nickname | nick_id | nickname_unique
-------------+---------+-----------------
amused-alex | 1 | amused-alex-1
amused-alex | 2 | amused-alex-2
good-joe | 3 | good-joe-1
good-joe | 4 | good-joe-2
good-joe | 5 | good-joe-3
(5 rows)
查询正在 nick_id
序列列上使用 RANK
函数。这样可以确保永远不会发生碰撞。