想要将值插入到自动编号(或者说是标识列,IDENTITY)中去,须要设定 SET IDENTITY_INSERT
示例:html
1.首先创建一个有标识列的表:spa
CREATE TABLE products ( id int IDENTITY PRIMARY KEY, product varchar(40) )
2.尝试在表中作如下操做:code
INSERT INTO products (id, product) VALUES(3, 'garden shovel')
结果会致使错误:“当 IDENTITY_INSERT 设置为 OFF 时,不能向表 'products' 中的标识列插入显式值。”htm
3.改用:blog
SET IDENTITY_INSERT products ON INSERT INTO products (id, product) VALUES(1, 'garden shovel')
返回正确。get
4.创建另一个表products2,尝试相同插入操做:class
CREATE TABLE products2 ( id int IDENTITY PRIMARY KEY, product varchar(40) )
而后执行:im
SET IDENTITY_INSERT products2 ON INSERT INTO products2 (id, product) VALUES(1, 'garden shovel')
致使错误:“表 'material.dbo.products' 的 IDENTITY_INSERT 已经为 ON。没法对表 'products2' 执行 SET 操做。”总结
改成执行:db
SET IDENTITY_INSERT products OFF SET IDENTITY_INSERT products2 ON INSERT INTO products2 (id, product) VALUES(2, 'garden shovel')
执行经过。
5.尝试如下操做:
SET IDENTITY_INSERT products2 ON INSERT INTO products2 SELECT * FROM products SET IDENTITY_INSERT products2 OFF
致使错误:“仅当使用了列的列表,而且 IDENTITY_INSERT 为 ON 时,才能在表 'products2' 中为标识列指定显式值。”
6.改成:
SET IDENTITY_INSERT products2 ON INSERT INTO products2(id, product) SELECT * FROM products SET IDENTITY_INSERT products2 OFF
执行经过。
7.IDENTITY列不必定非要是主键或惟一键列,实际上做为IDENTITY的列只要求不能为空,可是IDENTITY列默认状况下是能够有重复值的,咱们来看下面的SQL语句:
CREATE TABLE [dbo].[DemoPerson]( [ID] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](50) NULL, [Age] [int] NULL ) ON [PRIMARY] GO SET IDENTITY_INSERT [dbo].[DemoPerson] ON INSERT INTO [dbo].[DemoPerson]([ID],[Name],[Age]) VALUES (1,N'Jack',31), (1,N'Jack',31), (2,N'Bob',32), (2,N'Bob',32), (3,N'Sam',33), (3,N'Sam',33) SET IDENTITY_INSERT [dbo].[DemoPerson] OFF SELECT * FROM [dbo].[DemoPerson] INSERT INTO [dbo].[DemoPerson]([Name],[Age]) VALUES (N'Tom',35) SELECT * FROM [dbo].[DemoPerson]
执行结果以下:
总结: