如果创建新表的时候将一个列设置为Identity,那么在插入数据的时候可以不显示的指定值,SQL Server会自动填充该列的值。
Create Table tblPerson1 ( PersonId Int Identity(1,1) Primary key Not Null, Name Nvarchar(50) null )
此时,可用下面的代码向表中插入数据。虽然tblPerson表有两列,但在插入的时候只用指定Name的值即可,因为PersonId的属性为Identity,在插入数据时SQL Server会自动计算该值(起始值为1,增量为1)。
Insert Into tblPerson1 Values (‘John‘)
但是,值得注意的是,如果我们显示的为tblPerson的PersonId指定一个值是不允许的,如下面的代码将会报错:
Insert Into tblPerson1 Values (2,‘Marttin‘)
Msg 8101, Level 16, State 1, Line 1
An explicit value for the identity column in table ‘tblPerson1‘ can only be specified when a column list is used and IDENTITY_INSERT is ON.
意思是,如果要显示的为Indentity列设置值,必须在插入语句中指定列名以及将IDENTITY_INSERT设置为ON。
根据报错信息,现在我们首先使用下面语句将IDENTITY_INSERT设置为ON状态:
Set IDENTITY_INSERT tblPerson1 ON
然后在插入语句中显示的列出列名:
Insert Into tblPerson1(PersonId,Name) Values (2,‘Marttin‘)
这样PersonId为2,Name为“Marttin”的记录就成功插入了。
但是这样又有一个问题,当我们不想显示提供PersonId列的值又会报错了:
Insert Into tblPerson1 Values (‘Marttin‘)
Msg 545, Level 16, State 1, Line 1
Explicit value must be specified for identity column in table ‘tblPerson1‘ either when IDENTITY_INSERT is set to ON or when a replication user is inserting into a NOT FOR REPLICATION identity column.
此时我们要将IDENTITY_INSERT设置为OFF:
Set IDENTITY_INSERT tblPerson1 OFF
这样就可以回到最开始的状态了。
现在有这样一种场景,我们将表中的数据清空,此时再向表中插入数据,PersonId的值会是多少呢?如下面的代码:
Delete From tblPerson1 Insert Into tblPerson1 Values (‘Bob‘)
若查询数据库,我们得知tblPerson表中的值是:
PersonId Name
4 Bob
如果我们想让PersonId重新开始计数,也就是新插入的值的PersonId为1,那么可以使用DBCC CHECKIDENT命令:
DBCC CHECKIDENT(‘tblPerson1‘,RESEED,0)
Checking identity information: current identity value ‘4‘, current column value ‘0‘.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
上面语句的意思是将identity 的值从4变成0,如果此时插入新的记录,那么PersonId的值将会是1
INSERT INTO tblPerson1 VALUES (‘SARA‘)
查询结果:
PersonId Name
1 SARA