首页 > 代码库 > 列属性:RowGUIDCol 和 Identity

列属性:RowGUIDCol 和 Identity

Table Column有两个特殊的属性RowGUIDCol 和 Identity,用于标记数据列:

  • $ROWGUID 用于引用被属性 RowGUIDCol 标识的UniqueIdentifier 类型的 column;
  • $IDENTITY 用于引用被属性 Identity 标识的整数类型(int,bigint,tinyint,smallint,decimal(p,0))的 column;
  • 在每个table中,只能有一列被标识为RowGUIDCol,只能有一列被标识为Identity;

一,属性说明

1,属性 IDENTITY(seed,increment)

属性Identity标识Column是ID列,每个Table只能有一个ID列。Identity属性必须设置seed和increment,默认值是:seed=1,increment=1,seed是ID列的第一个值,increment是每次数据增加的大小,例如,IDENTITY(2,3) 表示,ID列的第一个值是2,每次增加3,第二个值是5,第三个值是8,等等。当向Table中插入数据行时,数据库引擎自动向该列中插入唯一的,递增的整数值。

When a new row is added to the table, the Database Engine provides a unique, incremental value for the column. Identity columns are typically used with PRIMARY KEY constraints to serve as the unique row identifier for the table.

Both the seed and increment or neither must be specified. If neither is specified, the default is (1,1).

  • seed  Is the value used for the very first row loaded into the table.
  • increment   Is the incremental value added to the identity value of the previous row loaded.
  • NOT FOR REPLICATION  In the CREATE TABLE statement, the NOT FOR REPLICATION clause can be specified for the IDENTITY property, FOREIGN KEY constraints, and CHECK constraints. If this clause is specified for the IDENTITY property, values are not incremented in identity columns when replication agents perform inserts. If this clause is specified for a constraint, the constraint is not enforced when replication agents perform insert, update, or delete operations.

2,属性 ROWGUIDCOL               

属性RowGUIDCol标识Column是GUID列,每个table中只有一个UniqueIdentifier数据列被标识为RowGUIDCol列。如果column被指定属性RowGUIDCol,那么,可以通过$ROWGUID引用。

3,引用属性标记的数据列

CREATE TABLE dbo.myTable_RowGUIDCol(    ColumnA uniqueidentifier ROWGUIDCOL not null            constraint DF__myTable_RowGUIDCol_ColumnA DEFAULT NewID(),    ColumnB int identity,    columnC varchar(10)) insert into dbo.myTable_RowGUIDCol(columnC)values(test)select $ROWGUID,$IDENTITYfrom dbo.myTable_RowGUIDCol

技术分享

二,显式向Identity 列插入值

默认情况下,不能向IDENTITY列种插入数值。在向Table中插入新数据行时,由数据库引擎自动向ID列种插入唯一的,递增数值。

要手动向ID列插入指定的数值,必须设置 Identity_Insert选项为ON。

SET IDENTITY_INSERT schema_name.table_name ON | OFF

应用该选项时,必须注意:

  • 在插入数据值,必须在Insert子句中显式指定Table的所有Column;
  • 如果插入值比当前的ID值大,那么SQL Server自动使用插入值作为新的ID值;
set IDENTITY_INSERT dbo.myTable_RowGUIDCol ONinsert into dbo.myTable_RowGUIDCol(ColumnA,ColumnB,columnC)values(newid(),3,test2)set IDENTITY_INSERT dbo.myTable_RowGUIDCol Offinsert into dbo.myTable_RowGUIDCol(columnC)values(test3)select ColumnA,ColumnB,columnCfrom myTable_RowGUIDCol

技术分享

三,RowGUIDCol 和 Identity 的比较

1,自增性

属性Identity 标识的整数类型的Column 具有自动增长的特点,除非设置SET IDENTITY_INSERT ON,否者,不能显式对Identity Column赋值。

Identity indicates that the new column is an identity column. When a new row is added to the table, the Database Engine provides a unique, incremental value for the column.

RowGUIDCol属性 用于标识UniqueIdentifier 列,唯一的作用是能够使用$ROWGUID引用。没有自动增长的特性,必须显式赋值,或者创建Default 约束,使用默认值赋值。对UniqueIdentifier 列赋值有两种方式:

  • 使用NewID(),NewSequentialID() 函数赋值;
  • 特定格式的字符串:‘xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx’,x是16进制数值,按照数字的位数,格式是:8-4-4-4-12,共32个数字,4个中划线;

2,Unique scope

在一个Table中,ID列的值是unique的,不同 Table 的Identity Column的值可能相同;

如果使用NewID(),或 NewSequentialID() 函数赋值对UniqueIdentifier列赋值,那么在整个 Server 内,所有UniqueIdentifier列的值是唯一的,即在同一个server内,不同table的 UniqueIdentifier column(使用NewID(),或 NewSequentialID() 函数赋值)的值是不相同的。

参考文档:

IDENTITY (Property) (Transact-SQL)

列属性:RowGUIDCol 和 Identity