我知道,SYS_GUID()返回一个16字节的RAW数据类型。但是当它转移到chars时,它将超过32字节的char类型。这与最大长度为char(16)的现有数据不兼容。那么是否可以使用Oracle聚合函数或语句生成一个16字节的char唯一ID?
答案 0 :(得分:3)
不确定这种方法是否会导致碰撞(需要从理论的角度进行检验),但我认为碰撞的可能性仍然很低:
select utl_raw.bit_xor(utl_raw.substr(sys_guid(), 1, 8),
utl_raw.substr(sys_guid(), 9)) id
from dual
connect by level <= 10;
另一种选择是使用最小值为SEQUENCE
的{{1}}并将其强制转换为字符数据类型。
1000000000000000
的主要目的是什么?您是否需要将其用作主键?
<强>更新强>
经过进一步考虑后,我建议坚持使用ID
,因为它是本机PK生成机制。如果您需要超过SEQUENCE
个唯一值(即1000000000000000到9999999999999999之间的数字),则可以使用十六进制表示。首先,让我们确定十六进制形式的16个字符的最小和最大数字(假设没有前导或尾随空格):
10^16 - 10^15 - 1
现在让我们使用确定的值创建select to_char(to_number('1000000000000000', 'XXXXXXXXXXXXXXXX')) min_value,
to_char(to_number('FFFFFFFFFFFFFFFF', 'XXXXXXXXXXXXXXXX')) max_value
from dual;
MIN_VALUE MAX_VALUE
--------------------------------------------
1152921504606846976 18446744073709551615
:
SEQUENCE
要将主键转换序列号值生成为十六进制格式:
create sequence my_sequence
minvalue 1152921504606846976
maxvalue 18446744073709551615
start with 1152921504606846976
increment by 1;