问题描述
我需要生成唯一的昵称,其中包含用户的名字和一些预定义形容词的随机单词。由于用户的名字和形容词的非唯一组合,可能会发生冲突。如何避免碰撞?我想在生成的序列中添加增量后缀,如 amused-alex
、amused-alex-1
、amused-alex-2
、...、amused-alex-n
。
我的想法是创建包含所有已使用名称的附加表:
昵称 | 计数 |
---|---|
逗乐亚历克斯 | 2 |
仿生约翰 | 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)
查询在 RANK
串行列上使用 nick_id
函数。这样可以确保永远不会发生冲突。