关于SET IDENTITY_INSERT !!!

本文通过具体实例演示了在SQL Server中如何使用标识列(idenity),包括设置标识插入、插入特定标识值以及标识值对后续插入操作的影响。展示了当插入的标识值大于或小于当前标识值时的不同行为。

 

/* 如果插入记录的标识值大于表的当前标识值,则SQL Server自动将新插入值作为当前标识值使用*/

create table tb (id int identity(1,1),col int)

go

set identity_insert tb on

insert tb values(10,1)

set identity_insert tb off

insert tb(col)  values(20)   ----------标识列从最新的状态开始递增

select *

from tb

/*-----------------------*/     

id    col

10    1

11    20 

 

--3. 如果插入记录的标识值小于表的当前标识值,则表的当前标识值不受新插入值的影响
--测试的表
CREATE TABLE tb(id int IDENTITY(1,1),col int)
INSERT tb VALUES(1)
INSERT tb VALUES(2)

--强制在表中插入标识值
SET IDENTITY_INSERT tb ON
INSERT tb(id,col) VALUES(1,11)
SET IDENTITY_INSERT tb OFF

INSERT tb(col) VALUES(3)
SELECT * FROM tb
/*--结果
id           col
----------------- -----------
1           1
2           2
1           11
3           3

--测试资料
CREATE TABLE t1(ID int IDENTITY,A int)
INSERT t1 VALUES(1)
INSERT t1 VALUES(2)
INSERT t1 VALUES(3)
DELETE FROM t1 WHERE A=2
GO

--将ID=3的记录的ID值改为2
SET IDENTITY_INSERT t1 ON
INSERT t1(ID,A) SELECT 2,A FROM t1 WHERE ID=3
DELETE FROM t1 WHERE ID=3
SET IDENTITY_INSERT t1 OFF
SELECT * FROM t1
/*--结果
ID          A
----------------- -----------
1           1
2           3
--*/

  对应于

id        a

1         1

3         3(因为第二条记录删除了,所以id不连续了)

SET IDENTITY_INSERT语句用于在插入数据时控制自增标识字段的值。 ### 作用 该语句的作用是使自增序列自动设置无效,从而允许用户手动为自增标识字段指定插入值。例如在表`testbak`中存在自增字段`id int identity(1,1)`,使用`SET IDENTITY_INSERT testBak ON`后,就能手动插入需要的`id`值 [^1]。 ### 使用方法 使用时需要在`INSERT INTO`语句前后分别加上`SET IDENTITY_INSERT TableName ON`和`SET IDENTITY_INSERT TableName OFF`。其中`TableName`是要操作的表名。示例如下: ```sql -- 开启自增标识字段手动插入功能 SET IDENTITY_INSERT tb_Users ON -- 插入或更新数据 if not exists(select * from tb_Users where id = 1) begin insert into tb_Users (id,name,url) values(1,'曹永思','http://www.cnblogs.com/yonsy') end else begin update tb_Users set id = 1, name = '曹永思', url = 'http://www.cnblogs.com/yonsy' where id = 1 end -- 关闭自增标识字段手动插入功能 SET IDENTITY_INSERT tb_Users OFF ``` 此示例中,对于`tb_Users`表,在插入或更新数据时,先开启手动插入自增标识字段的功能,操作完成后再关闭该功能 [^2]。 另一个例子是创建一个`products`表,在删除数据造成自增标识值有空隙后,使用该语句手动插入指定`id`值的数据: ```sql -- 创建含有标识列的表 CREATE TABLE products ( id int IDENTITY PRIMARY KEY, product varchar(40) ) GO -- 向表中插入数据 INSERT INTO products (product) VALUES ('screwdriver') INSERT INTO products (product) VALUES ('hammer') INSERT INTO products (product) VALUES ('saw') INSERT INTO products (product) VALUES ('shovel') GO -- 删除数据造成标识值空隙 DELETE products WHERE product = 'saw' GO -- 尝试直接插入指定id值,会返回警告 INSERT INTO products (id,product) VALUES (3,'garden shovel') GO -- 开启手动插入自增标识字段功能 SET IDENTITY_INSERT products ON GO -- 再次尝试插入指定id值 INSERT INTO products (id,product) VALUES (3,'garden shovel') GO -- 查看表中数据 SELECT * FROM products GO -- 删除表 DROP TABLE products GO ``` 这里先创建表并插入数据,删除一条记录后造成标识值空隙,直接插入指定`id`值会报错,开启`SET IDENTITY_INSERT`后就能成功插入指定`id`值的数据 [^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值