我应该如何在Oracle中存储GUID?

我来自我们拥有唯一标识符的SQL服务器世界。 在oracle中有没有相当的东西? 本专栏将经常被查询,所以表演是关键。

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

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

这个博客研究了相对的performance。

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

 SQL> SELECT SYS_GUID() FROM DUAL; SYS_GUID() -------------------------------- 248AACE7F7DE424E8B9E1F31A9F101D5 

可以创build一个函数来返回格式化的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 ; / 

因此返回一个可互换的string:

 SQL> SELECT GET_FORMATTED_GUID() FROM DUAL ; GET_FORMATTED_GUID() -------------------------------------- {15417950-9197-4ADD-BD49-BA043F262180} 

需要注意的是,一些Oracle平台返回Steven Feuerstein 指出的类似但仍然唯一的GUID值。

如果我正确理解这个问题,当你在数据库中插入一行时,你想要生成一个唯一的ID。
你可以使用一个序列来做到这一点。 链接在这里
一旦你创build了你的序列,你可以像这样使用它:

 INSERT INTO mytable (col1, col2) VALUES (myseq.NEXTVAL, 'some other data'); 

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

RAW(16)显然是唯一标识符MS SQLtypes的首选等价物。

Oracle中没有唯一标识符。

你可以通过使用RAW(一种痛苦)或CHAR来实现一个。 与使用整数相比,在CHAR字段上JOIN的查询的性能将会受到影响(可能高达40%)。

如果您正在分布式/复制数据库,性能受到重视是值得的。 否则,只需使用一个整数。

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