想要將值插入到自動編號(或者說是標識列,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]
執行結果以下:
總結: