2011-07-20 62 views
0

如果2 不同數據庫運行NEWID(),如果同一臺機器上有兩個不同的數據庫運行NEWID(),是否保證永遠不會有衝突?在同一臺機器上

它是保證永遠不會有衝突?

+0

我認爲你需要在這裏得到更多的細節。我假設你正在談論MS SQL Server,但尚不清楚。另外它通常有助於發佈一些代碼,以便用戶可以瞭解您正在討論的背景。 – bittersweetryan

+0

是的,我的意思是mssql服務器 – Gerray

回答

0

NEWID將是唯一爲您的機器,但不一定是唯一到處所有機器。

+0

如果2 **不同的**數據庫在同一臺機器上運行NEWID(), 是否保證永遠不會有衝突? – Gerray

+0

期望這是安全的。 – cwallenpoole

0

NEWID()是SQL Server中的一個非確定性函數,它返回類型爲uniqueidentifier的唯一值。 MSDN文檔明確指出:「返回一個唯一值」。

您可以使用它像這樣:

DECLARE @foo uniqueidentifier = NEWID(); 
SELECT @foo; 

您也可以使用它作爲一個表中的默認列值。

CREATE TABLE [dbo].[TestTable](
    [ID] [uniqueidentifier] NOT NULL DEFAULT newid(), 
)  

服務器在兩個數據庫上生成相同GUID的機會非常小。太小,不用擔心。爲了探索/測試/確認這一點,你必須分析NEWID()的實現。

5

它在統計學上足夠獨特。在發生碰撞之前,世界將會結束。

在大多數機器互相發送數據的大多數複製方案中,GUID是必需的:不能在沒有GUID的情況下設置複製。所以當然可以在很多機器上使用

2

NEWID()值是隨機生成的。雖然從統計學角度而言,機會NEWID()返回的值可能會發生衝突,根據全部機器在全球範圍內生成值,但您需要擔心更多可能發生的事件,例如整個服務器自發燃燒。


在一臺Windows機器,有一個單一的Windows功能負責其成爲可通過NEWID()函數的值,它甚至不太可能產生連續兩個相同的值比任何兩個隨機機這樣做 - 所以概率是,低於,在同一臺機器上的兩個不同數據庫上的調用將產生相同的值。

1

這是我的理解(雖然我無法驗證)NEWID()使用RPC UUIDCreate生成從機器的MAC地址,隨機數和日期和時間戳得出的唯一GUID。另外UUIDCreate專門爲每個呼叫返回一個唯一的ID。我還沒有遇到任何問題。由於包括Active Directory在內的許多功能都非常依賴於唯一的GUID,因此我相當肯定Microsoft確保此方法確實能夠跨機器生成唯一的標識符。我知道的唯一風險是當兩臺機器具有相同的MAC地址時。也許有人可以找到定義算法的特定文檔。

相關問題