如何在Oracle中生成GUID?

Aci*_*ibi 81 oracle guid

是否可以在Insert语句中自动生成GUID?

另外,我应该使用什么类型的字段来存储此GUID?

Ton*_*ews 126

您可以使用SYS_GUID()函数在insert语句中生成GUID:

insert into mytable (guid_col, data) values (sys_guid(), 'xxx');
Run Code Online (Sandbox Code Playgroud)

用于存储GUID的首选数据类型是RAW(16).

正如Gopinath回答:

 select sys_guid() from dual
 union all
 select sys_guid() from dual
 union all 
 select sys_guid() from dual
Run Code Online (Sandbox Code Playgroud)

你得到

88FDC68C75DDF955E040449808B55601
88FDC68C75DEF955E040449808B55601
88FDC68C75DFF955E040449808B55601

正如托尼安德鲁斯所说,只有一个角色不同

88FDC68C75D D F955E040449808B55601
88FDC68C75D E F955E040449808B55601
88FDC68C75D F F955E040449808B55601

也许有用:http: //feuerthoughts.blogspot.com/2006/02/watch-out-for-sequential-oracle-guids.html

  • 你确定它们完全一样吗?它确实倾向于返回非常相似(但不同)的值 - 例如,当我刚刚尝试时,我得到88FDC68C75DEF955E040449808B55601和88FDC68C75DFF955E040449808B55601,它们仅在第12个字符上有所不同! (10认同)
  • 哦耶!非常感谢,我读得太快了;) (2认同)

TTT*_*TTT 26

您还可以在表的create语句中包含guid作为默认值,例如:

create table t_sysguid
( id     raw(16) default sys_guid() primary key
, filler varchar2(1000)
)
/
Run Code Online (Sandbox Code Playgroud)

见这里:http://rwijk.blogspot.com/2009/12/sysguid.html


小智 13

示例位于:http : //www.orafaq.com/usenet/comp.databases.oracle.server/2006/12/20/0646.htm

SELECT REGEXP_REPLACE(SYS_GUID(), '(.{8})(.{4})(.{4})(.{4})(.{12})', '\1-\2-\3-\4-\5') MSSQL_GUID  FROM DUAL 
Run Code Online (Sandbox Code Playgroud)

结果:

6C7C9A50-3514-4E77-E053-B30210AC1082 
Run Code Online (Sandbox Code Playgroud)

  • 希望我能为此请你喝一杯。+1 (2认同)

Bur*_*sBA 8

如果您需要非顺序引导,您可以sys_guid()通过哈希函数发送结果(请参阅/sf/answers/1577439041/)。这个想法是保留原始创作中使用的任何独特性,并获得具有更多改组位的东西。

例如:

LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32))  
Run Code Online (Sandbox Code Playgroud)

显示默认顺序 guid 与通过哈希发送它的示例:

SELECT LOWER(SYS_GUID()) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SYS_GUID()) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SYS_GUID()) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SYS_GUID()) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32)) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32)) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32)) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32)) AS OGUID FROM DUAL  
Run Code Online (Sandbox Code Playgroud)

输出

SELECT LOWER(SYS_GUID()) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SYS_GUID()) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SYS_GUID()) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SYS_GUID()) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32)) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32)) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32)) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32)) AS OGUID FROM DUAL  
Run Code Online (Sandbox Code Playgroud)


Ken*_*nic 7

通过在insert语句中自动生成一个guid来表达你的意思并不清楚,但我猜你正在尝试做类似以下的事情:

INSERT INTO MY_TAB (ID, NAME) VALUES (SYS_GUID(), 'Adams');
INSERT INTO MY_TAB (ID, NAME) VALUES (SYS_GUID(), 'Baker');
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我认为ID列应该声明为RAW(16);

我正在做这件事.我没有方便测试的Oracle实例,但我认为这就是你想要的.


Mik*_*att 7

sys_guid() 是一个糟糕的选择,正如其他答案所提到的。生成 UUID 并避免序列值的一种方法是自己生成随机的十六进制字符串:

select regexp_replace(
    to_char(
        DBMS_RANDOM.value(0, power(2, 128)-1),
        'FM0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'),
    '([a-f0-9]{8})([a-f0-9]{4})([a-f0-9]{4})([a-f0-9]{4})([a-f0-9]{12})',
    '\1-\2-\3-\4-\5') from DUAL;
Run Code Online (Sandbox Code Playgroud)

  • 这些不能保证是唯一的。如果您要存储它,您需要将它与存储位置的唯一约束配对。(如果遇到重复值并违反唯一约束,则生成一个新数字,但可能性不大) (4认同)