NEWID() 函數,**不支援** `IDENTITY` 自動遞增。
DECLARE @MyId UNIQUEIDENTIFIER;
SET @MyId = NEWID();
PRINT 'Value: ' + CONVERT(VARCHAR(36), @MyId);
-- 輸出範例:6F9619FF-8B86-D011-B42D-00C04FC964FF
CREATE TABLE Cust (
CustomerId UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID(),
Company VARCHAR(30) NOT NULL,
ContactName VARCHAR(60) NOT NULL,
-- 其他欄位...
);
INSERT INTO Cust (Company, ContactName, ...) VALUES ('Acme', 'John', ...); -- CustomerId 自動產生
DECLARE @MyId UNIQUEIDENTIFIER;
SET @MyId = 'A972C577-DFB0-064E-1189-0154C99310DA'; -- 必須符合格式
| 缺點 | 影響 |
|---|---|
| 值長 (16 bytes) vs INT (4 bytes) | 索引體積膨脹 4 倍,記憶體/快取效率降低,I/O 增加 |
| 隨機分佈 (NEWID 非循序) | 導致叢集索引嚴重分頁分裂、碎片化、寫入效能劇降 |
| 無序無意義 | 難以除錯、人工記憶、排序無業務語意 |
| 不支援遞增依賴邏輯 | 無法用 `>` 比較新舊記錄,破壞部分應用模式 |
`uniqueidentifier` + `NEWID()` 提供全域唯一識別能力,是分散式、整合、公開識別碼的利器。但其隨機性與體積代價,使其**不適合**作為高頻單機核心交易表的叢集索引鍵。選型時必須在「全域唯一性需求」與「儲存/效能成本」間權衡,善用 `NEWSEQUENTIALID()` 緩解分頁分裂問題。