我希望具有唯一 6 个字符 ID(即 zab4ac、cba884...)的用户可以搜索我的内容。
我正在考虑创建一个id character(6) primary key
列,但后来我开始想知道如何为新行创建 id。它们可以是随机的或连续的,这对我来说并不重要,但我想知道最好的选择是什么:
- 对于每个
INSERT
,执行 aSELECT
来获取最后一个键,然后“递增它”? - 或者创建一个随机密钥并验证它是否已经存在?
由于这些看起来效率低下(每次插入 2 个查询),是否有一种自动化的方法来做到这一点,例如serial
,但对于字符(000009、00000a、00000b、...、00000z、000010、...或更随机的东西) ?或者我应该在数据库中使用serial
并将其转换为用户的字符串?
我想看看我是否缺少一种简单有效的解决问题的方法。
这在数据库解决方案中曾经非常常见。
两者都是在触发器中构建的。例如在五金店,我的账号是 GUPR23。数字 ID 更容易记住。
在我的一款产品上,我有类似的选择。如果用户未指定,则客户端和员工 ID 会自动构建。如果不是唯一的,用户将不得不选择另一个,否则系统将使其顺序化。
对于商品,我给了他们上述选项或 soundex 代码。但我并没有让它们变得独一无二。在搜索时,如果有重复项,系统会向他们显示匹配的项,然后他们会选择一个。
两种方案都在插入触发器之前实现。
如果您确实想做类似的事情,则数字转换为不同的基数可能很有用并且易于实现。例如,基数 36 的数字包含所有数字 0-9 和字母 AZ 。它应该很容易实现(还有一个关于堆栈溢出的示例: https ://stackoverflow.com/questions/5997241/postgresql-is-there-a-function-that-will-convert-a-base- 10-int-into-a-base-36-s。
然后你可以创建一个序列并将其' nextval 作为参数传递给函数。假设你正在使用这个函数,你最终会得到类似的结果