2008-09-30 67 views
40

我來自SQL服務器世界,我們有uniqueidentifier。在oracle中有沒有相當的東西?本專欄將經常被查詢,所以表演是關鍵。我應該如何在Oracle中存儲GUID?

我在.Net中生成GUID並將它傳遞給Oracle。由於幾個原因,它不能由oracle生成,所以我不能使用序列。

回答

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

This blog研究了相對錶現。

+0

該博客只比較工作與從數據庫生成的GUID作爲與sequ​​ence.nextval一起工作,但我不知道如何使用.net代碼生成的GUID工作時的性能? – gillyb 2011-02-21 15:02:51

0

Oracle中沒有唯一標識符。

您可以使用RAW(某種疼痛)或CHAR自己實現一個。與使用整數相比,在CHAR字段上JOIN的查詢的性能會受到影響(可能高達40%)。

如果你正在做分佈式/複製數據庫,性能命中是值得的。否則,只需使用一個整數。

0

使用Oracle的一般做法是創建一個人工密鑰。這是一個定義爲數字的列。它通過一個序列填充。它通過主鍵定義被索引/約束。

3

如果我正確理解這個問題,當你在db中插入一行時,你想要生成一個唯一的id。
您可以使用序列來執行此操作。 link here
一旦你創建你的序列,你可以使用它像這樣:

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

GUID是不是在Oracle用作MSSQL,我們往往有一個域(NOT NULL &主鍵),一序列和插入時的觸發器來填充它(對於每個表)。

6

正如其他人所說的那樣,與數字序列相比,使用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值as noted Steven Feuerstein。

2

RAW(16)顯然是唯一標識符MS SQL類型的首選等效項。

相關問題