在SQL Server中,创建数据表,需要为表设置合适的属性和约束,例如,自增列,非空,主键等,以满足业务的需求,一般来说,数据表存储的实体都应该唯一标识,使用ID列或GUID列来充当候选主键是可以的,相应地,数据表的列(Column)有两个特殊的属性:

  • RowGUIDCol:用于标识UniqueIdentifier 类型的数据列,该列可以通过内置函数 $ROWGUID 来引用;
  • Identity:用于标识整数类型(int,bigint,tinyint,smallint,decimal(p,0))的列是自增列,该列可以通过内置函数$IDENTITY 来引用;

在每个表中,只能有一列被标识为RowGUIDCol,只能有一列被标识为Identity;

一,属性说明

1,自增属性

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

<column_definition> ::=
column_name <data_type> [ NULL | NOT NULL ]
   IDENTITY [ ( seed ,increment ) ] [ NOT FOR REPLICATION ]

2,属性 ROWGUIDCOL

属性RowGUIDCol标识一个数据列是GUID列,数据表中可以有多个UniqueIdentifier类型数据列,但是每个表中只能有一个UniqueIdentifier数据列被标识为RowGUIDCol列。如果列被指定属性RowGUIDCol,那么可以通过$ROWGUID引用,不需要通过列名来引用。

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

当访问被属性RowGUIDCol和Identity标记的数据列时,可以通过函数$RowGUID和$Identity来引用,不需要通过列名:

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,$IDENTITY
from dbo.myTable_RowGUIDCol

二,显式向自增列插入值

默认情况下,不能向IDENTITY列中插入数值。一般来说,在向数据表中插入新的数据行时,由数据库引擎自动向自增列中插入唯一的,递增的正整数值。

当想要手动向自增列中插入指定的数值,必须设置表的 Identity_Insert选项为ON。

SET IDENTITY_INSERT schema_name.table_name ON | OFF

1,启用该选项时,必须注意:

  • 在插入数据值,必须在Insert子句中显式指定Table的所有Column;
  • 如果插入值比当前的ID值大,那么SQL Server自动使用插入值作为新的ID值;
set IDENTITY_INSERT dbo.myTable_RowGUIDCol ON

insert into dbo.myTable_RowGUIDCol
(ColumnA,ColumnB,columnC)
values(newid(),3,'test2') set IDENTITY_INSERT dbo.myTable_RowGUIDCol Off insert into dbo.myTable_RowGUIDCol(columnC)
values('test3') select ColumnA,ColumnB,columnC
from myTable_RowGUIDCol

2,创建示例数据

create table dbo.ta
(
id int identity(1,1) not null,
name varchar(10) null
) insert into dbo.ta
values(1,'a')

出现错误: An explicit value for the identity column in table 'dbo.ta' can only be specified when a column list is used and IDENTITY_INSERT is ON.

2.1,将选项 IDENTITY_INSERT 设置为ON

set IDENTITY_INSERT dbo.ta on

2.2,显式向ID列赋值

insert into dbo.ta
values(1,'a')

由于没有在Insert子句中,显式列出table的所有column,SQL Server Engine抛出错误:

An explicit value for the identity column in table 'dbo.ta' can only be specified when a column list is used and IDENTITY_INSERT is ON.

2.3,显式列出Target Table的所有column

insert into dbo.ta(id,name)
values(1,'a')

三,RowGUIDCol 和 Identity 的比较

1,自增性

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

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

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

2,“唯一”的范围

在一个表中,ID列的值是唯一的,不同表的ID列的值可能相同;

如果使用NewID(),或 NewSequentialID() 函数赋值对UniqueIdentifier列赋值,那么在整个服务器内,所有UniqueIdentifier列的值是唯一的,即在同一个服务器的数据库中,不同数据表的GUID列(使用NewID(),或 NewSequentialID() 函数赋值)的值是不相同的。

四,ID列的Not For Replication

Identity列的值是SQL Server Engine自动生成的,唯一的,递增的整数值。默认情况下,用户不能显式插入数值。当启用表的复制(Replication)时,ID列被复制/同步到其他订阅表中,如何使两个表的ID列值保持一致?SQL Server提供的做法是:在创建订阅数据表时,为ID列指定 not for replication 属性。当分发代理(distribution agent)执行Insert 命令时,ID列被显式赋值,并且ID列的标识值不会自增,跟普通的整数列的行为相同。

在发布端中,虽然Identity列不需要指定Not For Replication属性,但是,由于快照复制(Snapshot Replication)能够把发布端(Publisher)中 Identity列的 not for replication属性复制到Subscriber中,因此,建议在发布端中创建数据表时,为Identity列指定Not For Replication属性。在事务复制中,如果没有为ID列指定 not for replication 属性,那么每次插入数据时,不管Insert 操作是失败还是成功,其ID列的标识值都会自增。

Not For Replication属性有两个作用:

  • 在事务复制中,Distribution能够对Subscriber Table中的ID列赋值,保持两个ID列数据的同步;
  • 在事务复制中,通过Distribution对Subscriber Table中的ID列赋值,该ID列的标识值不变;

如果显式对ID列赋值,并且该值大于当前ID列的标识值,那么ID列的标识列变为该值;如果显式对该表执行Insert操作,那么,ID列的标识值将增加。

例如,假如TableA的ID列名是EventID,该列具有not for replication属性,

create table dbo.TableA
(
EventID int not null identity(1,1) not for replication ,
name varchar(10) null
)

通过Replication同步到该列的最大值是100,但是该列的标识值不变,仍然是1。如果向该表中插入数据,那么,第一个ID值是1,第二个ID值是2,依次类推。

参考文档:

IDENTITY (Property) (Transact-SQL)

NOTE 2----IDENTITY属性字段上加上NOT FOR REPLICATION设置

Replicate Identity Columns

列属性:RowGUIDCol、Identity 和 not for replication的更多相关文章

  1. 使用IDENTITY列属性和Sequence对象

    使用IDENTITY列属性 1. 建立表 Sales.MyOrders USE TSQL2012; IF OBJECT_ID(N'Sales.MyOrders', N'U') IS NOT NULL ...

  2. jqGrid使用setColProp方法动态改变列属性

    在使用jqGrid插件时,有时我们需要动态改变列的属性,可使用setColProp方法,用法如下 jQuery(”#grid_id”).setColProp('colname',{editoption ...

  3. 学习笔记:MySQL列属性

    列属性 a)         null|not null 缺省值是null,也就是允许为空,如果是not null而又没有给该字段赋值的话,系统会首先查询该字段有没有默认值 b)         de ...

  4. mysql数据类型和列属性

    列属性: 定义一个字段时对该字段设置的额外的信息或约束 1.  关联操作:reference 2.  字段默认值:default value 3.  主索引和唯一索引:primary key 和uni ...

  5. SQL语句实现取消自增列属性

    SQL语句实现取消自增列属性 --由于在SQL-SERVER中,自增列属性不能直接修改,但可以通过以下方式变向实现 --1.如果仅仅是指定值插入,可用以下语句,临时取消 SET IDENTITY_IN ...

  6. 使用C#导出MSSQL表数据Insert语句,支持所有MSSQL列属性

    在正文开始之前,我们先看一下MSSQL的两张系统表sys.objects . syscolumnsMSDN中 sys.objects表的定义:在数据库中创建的每个用户定义的架构作用域内的对象在该表中均 ...

  7. easyui datagrid 表格组件列属性formatter和styler使用方法

    明确单元格DOM结构 要想弄清楚formatter和styler属性是怎么工作的,首先要弄清楚datagrid组件内容单元格的DOM接口,注意,这里指的是内容单元格,不包括标题单元格,标题单元格的结构 ...

  8. TextBox 绑定到DataTable某一列属性上

    将TextBox绑定到DataTable某一列属性上 DataTable dt = GetDataTable() textBox1.DataBindings.Add("Text", ...

  9. CC3的多列属性Multi-column

    CC3的多列属性Multi-column 一直都很想了解这个属性,总是忘了.今天可以研究一下,回想起想了解它的原因,大概是觉得它很容易分开几列.可能会有很多好处和方便. 0 16-09-17 1 16 ...

随机推荐

  1. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 1.实施前准备工作 1.1 服务器安装操 ...

  2. 标准产品+定制开发:专注打造企业OA、智慧政务云平台——山东森普软件,交付率最高的技术型软件公司

    一.公司简介山东森普信息技术有限公司(以下简称森普软件)是一家专门致力于移动互联网产品.企业管理软件定制开发的技术型企业.公司总部设在全国五大软件园之一的济南齐鲁软件园.森普SimPro是由Simpl ...

  3. Yii1.1的验证规则

    在Yii1.1的数据验证是由CValidator完成,在CValidator中提供了各种基本的验证规则 <?php public static $builtInValidators=array( ...

  4. Hyper-V3:虚拟机的配置

    在Hyper-V成功新建一台虚拟机,在正式使用之前,必须配置VM使用的硬件资源,并授予用户访问VM的权限等,本文罗列出一些常见的配置,供读者参阅. 一,为虚拟机分配使用的内存 在Hyper-V Man ...

  5. 预览github里面的网页或dome

    1.问题所在: 之前把项目提交到github都可以在路径前面加上http://htmlpreview.github.io/?来预览demo,最近发现这种方式预览的时候加载不出来css,js(原因不详) ...

  6. .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验

    不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...

  7. CRL快速开发框架系列教程十三(嵌套查询)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  8. Java程序:从命令行接收多个数字,求和并输出结果

    一.设计思想:由于命令行接收的是字符串类型,因此应先将字符串类型转化为整型或其他字符型,然后利用for循环求和并输出结果 二.程序流程图: 三.源程序代码:   //王荣荣 2016/9/23     ...

  9. 深入理解javascript函数定义与函数作用域

    最近在学习javascript的函数,函数是javascript的一等对象,想要学好javascript,就必须深刻理解函数.本人把思路整理成文章,一是为了加深自己函数的理解,二是给读者提供学习的途径 ...

  10. SharePoint2016安装的过程的”Microsoft.SharePoint.Upgrade.SPUpgradeException”错误解决方法

    前提 在windows server 2012的服务器上运行安装sharepoint2016出现如下错误: Could not load file or assembly ‘Microsoft.Dat ...