`

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

阅读更多

想要将值插入到自动编号(或者说是标识列,IDENTITY)中去,需要设定 SET IDENTITY_INSERT

示例:

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 ON
INSERT 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 ON
INSERT INTO products2 (id, product) VALUES(1, 'garden shovel')

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

改为执行:
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

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

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

执行通过。

总结:

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

附:
SQL Server帮助文档相关内容

SET IDENTITY_INSERT
允许将显式值插入表的标识列中。

语法
SET IDENTITY_INSERT [ database . [ owner . ] ] { table } { ON | OFF }

参数
database

是表所有者的名称。

table

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

SET IDENTITY_INSERT 的设置是在执行或运行时设置,而不是在分析时设置。

权限
执行权限默认授予 sysadmin 固定服务器角色和 db_owner 及 db_ddladmin 固定数据库角色以及对象所有者。

示例
下例创建一个含有标识列的表,并显示如何使用 SET IDENTITY_INSERT 设置填充由 DELETE 语句导致的标识值中的空隙。

-- Create products table.CREATE TABLE products (id int IDENTITY PRIMARY KEY, product varchar(40))GO-- Inserting values into products table.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-- Create a gap in the identity values.DELETE products WHERE product = 'saw'GOSELECT * FROM productsGO-- Attempt to insert an explicit ID value of 3;-- should return a warning.INSERT INTO products (id, product) VALUES(3, 'garden shovel')GO-- SET IDENTITY_INSERT to ON.SET IDENTITY_INSERT products ONGO-- Attempt to insert an explicit ID value of 3INSERT INTO products (id, product) VALUES(3, 'garden shovel').GOSELECT * FROM productsGO-- Drop products table.DROP TABLE productsGO

总结:

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

 

分享到:
评论

相关推荐

    SQL Server 之 SET IDENTITY_INSERT

    `SET IDENTITY_INSERT`允许我们在插入数据时显式地为标识列指定一个具体的值。这在需要控制数据插入顺序或需要在标识列中插入非连续值时非常有用。例如,如果需要在表中插入一条记录,并且希望这条记录的标识列值为...

    Set IDENTITY _INSERTY用法

    **结果分析:** 当 `IDENTITY_INSERT` 设置为 `ON` 时,可以通过这种方式批量插入包含 `IDENTITY` 值的记录。 ##### 示例六:指定字段进行批量插入 如果只想插入特定字段的值,可以进一步指定字段列表: ```sql ...

    sqlsever为标识列指定显式值

    标题和描述中提到的问题是,在尝试为SQL Server表中的标识列插入显式值时,系统返回错误提示:“仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'*'中的标识列指定显式值”。这个错误意味着我们在没有开启...

    在SQL Server数据库中为标识(IDENTITY)列插入显式值

    这时,我们可以使用`SET IDENTITY_INSERT`语句来开启对标识列显式插入值的功能。具体操作如下: 首先,我们需要使用`SET IDENTITY_INSERT [TableName] ON`命令来允许对特定表(如`member`)的标识列进行显式插入。...

    Insert语句向标识列中插入数据.pdf

    **实例3**:如果需要显式地为标识列插入特定值,就需要使用`SET IDENTITY_INSERT`语句。首先,启用标识插入: ```sql Set Identity_Insert identitytable on ``` 然后执行插入操作: ```sql Insert into identity...

    如何在数据库标识列里插入特定的值

    总结来说,要向数据库中的标识列插入特定值,必须先开启 `IDENTITY_INSERT`,然后执行插入操作,最后关闭 `IDENTITY_INSERT`。这个过程只应在必要时进行,同时考虑到可能的并发问题和数据冲突。对于大型系统,可能...

    sql Set IDENTITY_INSERT的用法

    1. 当 `IDENTITY_INSERT` 设置为 `ON` 时,不能在同一会话中对同一表再次执行 `SET IDENTITY_INSERT ON`。 2. 如果尝试插入的值已经存在于标识列中,或者超过了该列的最大值,插入操作将失败。 3. 在数据迁移后,...

    sqlserver自动增长列引起的问题解决方法

    错误提示"仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'*'中的标识列指定显式值"表明,系统不允许直接对具有自动增长属性的列插入显式值。这是SQL Server的一个安全机制,以防止意外覆盖自动增长序列。...

    SQL Server手工插入标识列的方法

    则在查询分析器里面会返回错误信息: [plain] 引用内容 服务器: 消息 544,级别 16,状态 1,行 1 当 IDENTITY_Insert 设置为 OFF 时,不能向表 ‘member’ 中的标识列插入显式值。 有的情况我们需要手动插入标识...

    230211-036shopDemo(Code-First自增型编号插入异常解决方案)

     //如果不包含上述定义,在通过SQL命令插入包含编号值的数据时会出现“当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'Address' 中的标识列插入显式值。”异常。  //注意:  // 如果在Code-First模式下的编号...

    identity用法总结

    SET IDENTITY_INSERT 允许将显式值插入表的标识列中。语法为:SET IDENTITY_INSERT [database.[ owner.]] {table } { ON |OFF },其中 database 是指定的表所驻留的数据库名称,owner 是表所有者的名称,table 是...

    SQL 在自增列插入指定数据的操作方法

    SQL Server 中数据表往往会设置自增列,常见的比如说 首列的ID列。 往数据表插入新数据的时候,自增列是跳过的,无需插入即会按照设置的自增规则进行列增长...仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为

    SQL server列自动增加方法

    创建包含标识列的表时,可以在`CREATE TABLE`语句中指定列的数据类型为`INT`(或其他整数类型),并设置`IDENTITY`属性。例如: ```sql CREATE TABLE Students ( ID INT IDENTITY(1,1), Name VARCHAR(50), Age...

    SpringMVCDemo:步骤1

    SpringMVCDemoThis is just a demo for learningIntelliJ IDEAJDKtomcatSQLServer 2017.2 |...报错:“ 当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'user' 中的标识列插入显式值 ”(在 BlogEntity.java 中也是一样)

    标识列与普通列相互转换示例

    标识列与普通列相互转的示例 --创建测试表 CREATE TABLE t1(ID int IDENTITY,A int) GO --插入记录 INSERT t1 VALUES(1) GO --1. 将IDENTITY(标识)列变为普通列 ALTER TABLE t1 ADD ID_temp int GO UPDATE t1 SET ...

Global site tag (gtag.js) - Google Analytics