set identity_insert testBak on|off用法
作用:testbak(id int identity(1,1) , char(10) name)
set identity_insert testBak on 使identity(1,1)自動設置序列無效,然後用戶就可以爲所欲爲插入需要的id值了。
1 創建一個含自增序列的表格
create table testIdentity(
id int identity(1,1),
name char(10)
)
2 正常向表中插入一條數據
---id號會自動生成爲1,這裏只用顯示指出要插入的字段爲name ,且name值爲'ming'
insert into testIdentity(name) values('ming');
3 指定id值向表中插入數據
注意:這是錯誤的做法,identify(1,1)會自動生成id號,identify(1,1)和用戶指定id值二者會衝突
insert into testIdentity(id,name) values(9,'yue');
報錯:當 IDENTITY_INSERT 設置爲 OFF 時,不能爲表 'testIdentity' 中的標識列插入顯式值。
原因:此時已設定 id 爲identity(1,1)自動生成,不能再自己設置id的值了。
改正:
---讓identity(1,1) 設置失效
set IDENTITY_INSERT testIdentity on
insert into testIdentity(id,name) values(9,'yue');
set IDENTITY_INSERT testIdentity off
此時則插入成功。
4 備份該表
--創建空的備份表
select * into testBak from testIdentity where 1=0
--讓備份表的identity(1,1)設置無效
set identity_insert testBak on
--顯示指出要複製的字段(id,name)
insert into testBak(id,name) select * from testIdentity
set identity_insert testBak off
5 其他注意事項:
(1)每一次連接會話中的任一時刻,只能對一個表設置IDENTITY_INSERT ON,且設置只對當前會話有效;
(2)set identity_insert testBak on set identity_insert testBak off 連用;
(3)在對標識列執行插入操作進,一定要顯示列出此標識列(當然,同時也就需要列出相關的其他列了)。