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 在行插入时创建一个随机但唯一的字符标识符的主要内容,如果未能解决你的问题,请参考以下文章

从字符串转换为唯一标识符时 ASP.NET 转换失败

Ansible:在行尾插入字符串,但前提是字符串不存在或/与更改值(如果存在)

通过 PHP 对移动设备进行唯一但持续的标识

oracle随机uuid字符串生成函数

DB2 v10 zos:识别空闲索引值

在哪里可以找到我在 DB2 上的表