仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'stulnfo'中的标识列指定显式值。

程序中出现这样的问题:设置Id的生成策略,如@GeneratedValue(strategy = GenerationType.IDENTITY)

数据库中出现这样的问题:

插入数据时,自增长列是系统自动处理,不需要你来指定数值,你也指定不了。只有将IDENTITY_INSERT 为 ON 时插入数据时,自增长列你才可以指定一个值比如我有一个表PZ,有如下列XH,ID,INX,KMID,FZZID,CODE ,JFJE,DFJE,RQ,ZY其中XH是自增长,正常插入数据时insert PZ (ID,INX,KMID,FZZID,CODE ,JFJE,DFJE,RQ,ZY) VALUES(......)不需要指定XH列。如果将IDENTITY_INSERT打开set IDENTITY_INSERT PZ (PZ为表名) ON 插入数据时就可以给XH列指定值INSERT PZ (XH,ID,INX,KMID,FZZID,CODE ,JFJE,DFJE,RQ,ZY) VALUES(指定表中没有的数值,24389,3,1524,1,'0109',0,0,'2011.1.29','JK')关闭IDENTITY_INSERTSET IDENTITY_INSERT PZ OFF其他解释:

当 IDENTITY_INSERT 设置为 OFF 时,不能向表 'products' 中的标识列插入显式值。”

示例:

1.首先建立一个有标识列的表:CREATE TABLE products (id int IDENTITY PRIMARY KEY, product varchar(40))

2.尝试在表中做以下操作:INSERT INTO products (id, product) VALUES(3, 'garden shovel')

结果会导致错误:“当 IDENTITY_INSERT 设置为 OFF 时,不能向表 'products' 中的标识列插入显式值。”

3.改用:SET IDENTITY_INSERT products ONINSERT INTO products (id, product) VALUES(1, 'garden shovel')

返回正确。

4.建立另外一个表products2,尝试相同插入操作:CREATE TABLE products2 (id int IDENTITY PRIMARY KEY, product varchar(40))

然后执行:SET IDENTITY_INSERT products2 ONINSERT INTO products2 (id, product) VALUES(1, 'garden shovel')

导致错误:“表 'material.dbo.products' 的 IDENTITY_INSERT 已经为 ON。无法对表 'products2' 执行 SET 操作。”

改为执行:SET IDENTITY_INSERT products OFFSET IDENTITY_INSERT products2 ONINSERT INTO products2 (id, product) VALUES(2, 'garden shovel')

执行通过。

5.尝试以下操作:SET IDENTITY_INSERT products2 ONINSERT INTO products2     SELECT * FROM products

导致错误:“仅当使用了列的列表,并且 IDENTITY_INSERT 为 ON 时,才能在表 'products2' 中为标识列指定显式值。”

6.改为:SET IDENTITY_INSERT products2 ONINSERT INTO products2     (id, product)     SELECT * FROM products

执行通过。

总结:

1.每一次连接会话中的任一时刻,只能对一个表设置IDENTITY_INSERT ON,且设置只对当前会话有效;2.在对标识列执行插入操作进,一定要列出此标识列(当然,同时也就需要列出相关的其他列了)。

你可能感兴趣的:(数据库)