標識列和GUID列

標識列和GUID列

在SQL Server的表中,可能會有兩種特殊的列。一種是標識列(Identity),一種是全球唯一標識符(GUID)

首先看第一種

通過使用 IDENTITY 屬性可以實現標識符列。這使得開發人員可以爲表中所插入的第一行指定一個標識號(Identity Seed 屬性),並確定要添加到種子上的增量(Identity Increment 屬性)以確定後面的標識號。將值插入到有標識符列的表中之後,數據庫引擎會通過向種子添加增量來自動生成下一個標識值。當您向現有表中添加標識符列時,還會將標識號添加到現有錶行中,並按照最初插入這些行的順序應用種子值和增量值。同時還爲所有新添加的行生成標識號。不能修改現有表列來添加 IDENTITY 屬性。

在用 IDENTITY 屬性定義標識符列時,注意下列幾點:

  • 一個表只能有一個使用 IDENTITY 屬性定義的列,且必須通過使用 decimalintnumericsmallintbiginttinyint 數據類型來定義該列。
  • 可指定種子和增量。二者的默認值均爲 1。
  • 標識符列不能允許爲 Null 值,也不能包含 DEFAULT 定義或對象。
  • 在設置 IDENTITY 屬性後,可以使用 $IDENTITY 關鍵字在選擇列表中引用該列。還可以通過名稱引用該列。
  • OBJECTPROPERTY 函數可用於確定一個表是否具有 IDENTITY 列,COLUMNPROPERTY 函數可用於確定 IDENTITY 列的名稱。
  • 通過使值能夠顯式插入,SET IDENTITY_INSERT 可用於禁用列的 IDENTITY 屬性。

    注意:

    如果在經常進行刪除操作的表中存在標識符列,那麼標識值之間可能會出現斷缺。已刪除的標識值不再重新使用。要避免出現這類斷缺,請勿使用 IDENTITY 屬性。而是可以在插入行時,以標識符列中現有的值爲基礎創建一個用於確定新標識符值的觸發器。

 

與標識列有關幾個特殊關鍵字

SELECT $IDENTITY FROM Adventureworks.Sales.SalesOrderHeader
SELECT IDENTITYCOL FROM Adventureworks.Sales.SalesOrderHeader

 

還有一個系統變量,可以返回當前最新的標識值: @@identity

 

然後來看看全球唯一標識符列

儘管 IDENTITY 屬性在一個表內自動進行行編號,但具有各自標識符列的各個表可以生成相同的值。這是因爲 IDENTITY 屬性僅在使用它的表上保證是唯一的。如果應用程序生成一個標識符列,並且該列在整個數據庫或全球聯網的所有計算機上的所有數據庫中必須是唯一的,請使用 uniqueidentifier 數據類型和 NEWID 或 NEWSEQUENTIALID() 函數。此外,還可以應用 ROWGUIDCOL 屬性以指示新列是行 GUID 列。與使用 IDENTITY 屬性定義的列不同,數據庫引擎不會爲 uniqueidentifier 類型的列自動生成值。若要插入全局唯一值,請爲該列創建 DEFAULT 定義來使用 NEWID 或 NEWSEQUENTIALID 函數生成全局唯一值。有關詳細信息,請參閱使用 uniqueidentifier 數據。

可以使用 $ROWGUID 關鍵字在選擇列表中引用具有 ROWGUICOL 屬性的列。這與通過使用 $IDENTITY 關鍵字可以引用 IDENTITY 列的方法類似。一個表只能有一個 ROWGUIDCOL 列,且必須通過使用 uniqueidentifier 數據類型定義該列。OBJECTPROPERTY (Transact-SQL) 函數可用於確定一個表是否具有 ROWGUIDCOL 列,COLUMNPROPERTY (Transact-SQL) 函數可用於確定 ROWGUIDCOL 列的名稱。

以下示例創建 uniqueidentifier 列作爲主鍵的表。此示例在 DEFAULT 約束中使用 NEWSEQUENTIALID() 函數爲新行提供值。將 ROWGUIDCOL 屬性應用到 uniqueidentifier 列,以便可以使用 $ROWGUID 關鍵字對其進行引用。


CREATE TABLE dbo.Globally_Unique_Data
(guid uniqueidentifier CONSTRAINT Guid_Default DEFAULT NEWSEQUENTIALID() ROWGUIDCOL,
    Employee_Name varchar(60)
CONSTRAINT Guid_PK PRIMARY KEY (guid) );
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章