DB2 在行插入时创建一个随机但唯一的字符标识符
Posted
技术标签:
【中文标题】DB2 在行插入时创建一个随机但唯一的字符标识符【英文标题】:DB2 creating a random but unique character identifier upon row insert 【发布时间】:2020-02-21 19:43:18 【问题描述】:我目前在一个 DB2 表中有一个列,它通过一个字符加密的值通过 Web 调用和过程传递。它是带有用于加密的 CSSID 的 CHARACTER(13) 类型。
这已经成为通过多个 API 适应的巨大痛苦,但最初的目的是允许我们在不是主键的调用中使用唯一 ID。
在 DB2-400 中,就 13 个或更多的字符串而言,下一个最好的东西是什么?该字符串是唯一的且在插入时随机创建,但不需要解密(只是一个普通字符串)?
有没有一种普遍适用的方法?我们不传递安全数据,因此不需要加密,但我们只需要一个随机创建的唯一字符
【问题讨论】:
保证唯一性是一项艰巨的工作。使用主键。 @GordonLinoff 我可以只拥有一个在增量和记录创建方面基本上反映主键的列吗?但可能会增加 5 而不是 1 我不知道主键是什么样的,但是当你知道它的类型时,有很多选项可以混淆一些东西——混杂字符串、重新映射字符、对数字进行算术计算. 目前只是一个加1的整数 你不能使用序列吗?它不是随机的,而是独一无二的。 【参考方案1】:试试hex(generate_unique())
。这是独一无二的CHAR(26)
字符串。
或to_char(timestamp(generate_unique()), 'YYYYMMDDHH24MISSFF6')
。您也可以使用to_char 函数的格式。可能有用,比如说,像 FF6SSMIHH24DDMMYYYY
这样的反向格式,以避免在大量插入活动时出现唯一索引页面争用。
【讨论】:
【参考方案2】:这是一条不适合 cmets 部分的评论。
我无法访问 DB2-400(不再),但我在 DB2 10.5 for Linux 中测试了以下代码。
create sequence seq1;
select concat('A', varchar_format(next value for seq1, '000000000000')) as my_id
from sysibm.sysdummy1;
结果,如果你连续运行 4 次:
A0000000000001
A0000000000002
A0000000000003
A0000000000004
也许 DB2-400 中有类似的东西。
【讨论】:
所以在一个过程中我可以执行 Create 语句,然后 ```插入表 (sequence_col) 值(选择 concat('A',varchar_format(seq1 的下一个值,'000000000000'))作为来自 sysibm.sysdummy1) 的 sequence_col) 应该可以。您可能希望在最后删除序列(即使在错误条件下)。【参考方案3】:听起来你可能在使用GENERATE_UNIQUE()
GENERATE_UNIQUE函数返回一个13字节的位数据字符串 long (CHAR(13) FOR BIT DATA)
其实和加密没什么关系...
在我看来,这几乎是理想的解决方案,它可以生成一个不同于简单数字标识的唯一值。那么你遇到了什么问题呢?
【讨论】:
以上是关于DB2 在行插入时创建一个随机但唯一的字符标识符的主要内容,如果未能解决你的问题,请参考以下文章