Oracle SYS_GUID不会改变。

15

我有一个适合使用GUID作为键的Oracle项目。我找到了以下代码片段

SET SERVEROUTPUT ON
BEGIN
FOR indx IN 1 .. 5
LOOP
DBMS_OUTPUT.put_line ( SYS_GUID );
END LOOP;
END;
/

来自http://feuerthoughts.blogspot.com/2006/02/watch-out-for-sequential-oracle-guids.html

当我在我的数据库上运行它(我尝试过版本10g和版本11),我得到的输出类似于:

64FE4083D6BA7CB4E0400F0A0E0A18B0
64FE4083D6BB7CB4E0400F0A0E0A18B0
64FE4083D6BC7CB4E0400F0A0E0A18B0
64FE4083D6BD7CB4E0400F0A0E0A18B0
64FE4083D6BE7CB4E0400F0A0E0A18B0

也就是说,该值从未更改!有没有什么我需要做的来使其按预期工作?

编辑:我不是很注意 - GUID在变化,但看起来我正在遭受链接上讨论的顺序GUID问题。

2个回答

21

这个值确实会改变...

           *
64FE4083D6BA7CB4E0400F0A0E0A18B0
64FE4083D6BB7CB4E0400F0A0E0A18B0
64FE4083D6BC7CB4E0400F0A0E0A18B0
64FE4083D6BD7CB4E0400F0A0E0A18B0
64FE4083D6BE7CB4E0400F0A0E0A18B0
           *

2
我们都经历过这种情况......你可以盯着一件事物一个小时,却没有发现你的同事在5秒钟内就能发现的问题。 - cagcowboy
2
我来这里的原因完全相同 - 非常微妙! - DaveK

20

看起来没问题。根据描述:

SYS_GUID生成并返回由16个字节组成的全局唯一标识符(RAW值)。在大多数平台上,生成的标识符由主机标识符、调用该函数的进程或线程的进程或线程标识符和该进程或线程的不重复值(字节序列)组成。

根据您的示例:

64FE4083D6BA7CB4E0400F0A0E0A18B0
64FE4083D6BB7CB4E0400F0A0E0A18B0
64FE4083D6BC7CB4E0400F0A0E0A18B0
64FE4083D6BD7CB4E0400F0A0E0A18B0
64FE4083D6BE7CB4E0400F0A0E0A18B0

没有人提到这些GUID值的分布情况。它们应该是不重复的,而且确实如此。除非您每次都得到完全相同的输出。


1
好眼力!我认为这就是我发布的那个帖子所谈论的问题。 - Greg Reynolds

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接