56

我来自我们拥有唯一标识符的 SQL 服务器世界。oracle中是否有等价物?此列将被频繁查询,因此性能是关键。

我在 .Net 中生成 GUID 并将其传递给 Oracle。由于几个原因,它不能由 oracle 生成,所以我不能使用序列。

4

7 回答 7

62
CREATE table test (testguid RAW(16) default SYS_GUID() ) 

该博客研究了相对性能。

于 2008-09-30T16:27:23.847 回答
8

正如其他人所说,与数字序列相比,使用 GUID 会降低性能。也就是说,自 Oracle 8i 起就有一个名为“ SYS_GUID() ”的函数可用,它提供原始等价物:

SQL> SELECT SYS_GUID() FROM DUAL;

SYS_GUID()
--------------------------------
248AACE7F7DE424E8B9E1F31A9F101D5

可以创建一个函数来返回格式化的 GUID:

CREATE OR REPLACE FUNCTION GET_FORMATTED_GUID RETURN VARCHAR2 IS guid VARCHAR2(38) ;
BEGIN
    SELECT SYS_GUID() INTO guid FROM DUAL ;
    
    guid :=
        '{' || SUBSTR(guid,  1, 8) ||
        '-' || SUBSTR(guid,  9, 4) ||
        '-' || SUBSTR(guid, 13, 4) ||
        '-' || SUBSTR(guid, 17, 4) ||
        '-' || SUBSTR(guid, 21) || '}' ;

    RETURN guid ;
END GET_FORMATTED_GUID ;
/

因此返回一个可互换的字符串:

SQL> SELECT GET_FORMATTED_GUID() FROM DUAL ;

GET_FORMATTED_GUID()
--------------------------------------
{15417950-9197-4ADD-BD49-BA043F262180}

应该注意的是,一些 Oracle 平台返回的 GUID 值相似但仍然是唯一的值,正如Steven Feuerstein 所指出的那样。

2020 年 11 月 3 日更新:在 10g 中,Oracle 添加了对正则表达式函数的支持,这意味着可以使用该REGEXP_REPLACE()函数简化连接。

REGEXP_REPLACE(
    SYS_GUID(),
    '([0-9A-F]{8})([0-9A-F]{4})([0-9A-F]{4})([0-9A-F]{4})([0-9A-F]{12})',
    '{\1-\2-\3-\4-\5}'
)

该表达式将 by 返回的字符串值分解SYS_GUID()为 5 组十六进制值并重建它,在每组之间插入一个“-”。

于 2009-10-07T21:21:27.463 回答
4

如果我正确理解了这个问题,您希望在数据库中插入一行时生成一个唯一的 id。
您可以使用序列来执行此操作。 链接在这里
一旦你创建了你的序列,你可以像这样使用它:

INSERT INTO mytable (col1, col2) VALUES (myseq.NEXTVAL, 'some other data');
于 2008-09-30T16:28:03.427 回答
3

RAW(16) 显然是唯一标识符 MS SQL 类型的首选等效项。

于 2012-02-27T23:48:37.770 回答
2

GUID 在 Oracle 中不像在 MSSQL 中那样使用,我们倾向于有一个 NUMBER 字段(不是 null 和主键)、一个序列和一个插入触发器来填充它(对于每个表)。

于 2008-10-06T19:38:05.373 回答
1

Oracle 中没有唯一标识符。

您可以使用 RAW(有点痛苦)或 CHAR 自己实现一个。与使用整数相比,在 CHAR 字段上 JOIN 的查询的性能会受到影响(可能高达 40%)。

如果您正在做分​​布式/复制数据库,那么性能损失是值得的。否则,只需使用整数。

于 2008-09-30T16:24:28.520 回答
0

使用 Oracle 的一般做法是创建人工密钥。这是一个定义为数字的列。它通过序列填充。它通过主键定义进行索引/约束。

于 2008-09-30T16:24:44.337 回答