我想用自己的自定义ID生成器替换PostgreSQL数据库中使用的某些序列。该生成器会生成一个带有校验位的随机数。因此,原来的内容如下:
SELECT nextval('customers')
会被替换为类似下面的内容:
SELECT get_new_rand_id('customer')
函数将返回一个类似于[1-9][0-9]{9}
的数字值,其中最后一位是校验和。我的担忧有:
- 如何使其原子化
- 如何避免重复返回相同的ID(这可以通过尝试将其插入带有唯一约束条件的列来捕获,但那时已经太晚了)
- 这真的是个好主意吗?
SELECT get_new_rand_id()
的形式调用,而是分配为id列的默认值,而不是nextval()
。
编辑:好的,下面有一些解释为什么:
那么为什么要这样过度复杂化呢?目的是隐藏主键不让客户知道。
我为每个新客户提供唯一的customerId(在数据库中生成的序列号)。由于我向客户通信该编号,因此我的竞争对手相当容易监视我的业务(还有其他类似发票号码和订单号码的编号)。这就是我想让它更加困难的原因(请注意:不是不可能,而是更困难)。
为什么要进行校验和?
在没有任何隐藏序列号的谈话之前,我向ordernr添加了一个校验位,因为在生产过程中有时会出现笨拙的操作,我的想法是将此作为未来保持的良好做法。
- 是否应添加额外列以放置向客户公开的ID并保留序列号为主键?
- 如何以明智和高效的方式生成要公开的ID?
- 校验和是否必要?