使用 Uniqueidentifier 資料

uniqueidentifier 資料類型中儲存做為全域唯一識別碼 (GUID) 使用的 16 位元組二進位值。GUID 是一種唯一的二進位數字;全世界的電腦都不會產生重複的 GUID 值。GUID 的主要用途是在有許多站台與許多電腦的網路上指派一個唯一識別碼。

為 uniqueidentifier 資料行取得 GUID 值通常是透過下列方法之一:

  • 在 Transact-SQL 陳述式、批次或指令碼中呼叫 NEWID 函數。

  • 在應用程式碼中呼叫傳回 GUID 的應用程式 API 函數或方法。

Transact-SQL 函數、應用程式 API 函數及方法會根據網路卡的識別碼加上從 CPU 時鐘取得的唯一數字產生 uniqueidentifier 新值。每片網路卡都有唯一的識別碼。NEWID 傳回的 uniqueidentifier 值是使用伺服器上的網路卡所產生的。應用程式 API 函數與方法傳回的 uniqueidentifier 值是使用用戶端上的網路卡所產生的。

uniqueidentifier 值通常不會定義為常數。您可以利用下列方式指定 uniqueidentifier 常數:

  • 字元字串格式:'6F9619FF-8B86-D011-B42D-00C04FC964FF'

  • 二進位格式:0xff19966f868b11d0b42d00c04fc964ff

uniqueidentifier 資料類型不會像 IDENTITY 屬性一樣自動為插入的資料列產生新的識別碼。例如,若要取得新的 uniqueidentifier 值,資料表必須有一個指定 NEWID 或 NEWSEQUENTIALID 函數的 DEFAULT 子句,或是 INSERT 陳述式必須使用 NEWID 函數。

CREATE TABLE MyUniqueTable
   (UniqueColumn   UNIQUEIDENTIFIER      DEFAULT NEWID(),
   Characters      VARCHAR(10) )
GO
INSERT INTO MyUniqueTable(Characters) VALUES ('abc')
INSERT INTO MyUniqueTable VALUES (NEWID(), 'def')
GO

[!附註]

您可以使用 NEWSEQUENTIALID 來產生 GUID,以減少在索引分葉層級的網頁爭用。NEWSEQUENTIALID 只能與 uniqueidentifier 類型的資料表資料行上的 DEFAULT 條件約束一起使用。

uniqueidentifier 資料行可以包含多個個別的 uniqueidentifier 值,除非該資料行也指定 UNIQUE 或 PRIMARY KEY 條件約束。參考其他資料表中 uniqueidentifier 主索引鍵的外部索引鍵資料行,當有多個資料列參考來源資料表中的同一個主索引鍵時,就會有多個個別的 uniqueidentifier 值。

資料表可以有多個 uniqueidentifier 資料行。每個資料表可以指派一個 uniqueidentifier 資料行具有 ROWGUIDCOL 屬性。ROWGUIDCOL 屬性是指出該資料行中的 uniqueidentifier 值會唯一識別資料表中的資料列。不過,此屬性並不會執行任何動作來強制。必須使用其他機制來強制這個唯一性,如為資料行指定 PRIMARY KEY 條件約束。ROWGUIDCOL 屬性主要用於 Microsoft SQL Server 的複寫功能。具有更新訂閱的合併式複寫與交易式複寫使用 uniqueidentifier 資料行,以確保資料列在資料表的多個副本中可唯一識別。

uniqueidentifier 資料類型有幾個缺點:

  • 這些值很長且不易辨認。這讓使用者難以正確地輸入,而且更不利於使用者記住。

  • 數值是隨機的,而且不接受可以對使用者更具意義的任何形式。

  • 無法決定產生 uniqueidentifier 值的順序。它們不適用於依據序列遞增索引鍵值的現有應用程式。

  • uniqueidentifier 資料類型有 16 個位元組,比其他資料類型 (如 4 個位元組的整數) 大得多。這表示使用 uniqueidentifier 索引鍵建立索引,可能會比使用 int 索引鍵來建立索引慢得多。

不需要全域的唯一性時,或想要循序遞增的索引鍵時,請考慮使用 IDENTITY 屬性。