想要将值插入到自动编号(或者说是标识列,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
是指定的表所驻留的数据库名称。
owner
是表所有者的名称。
table
是含有标识列的表名。
注释
任何时候,会话中只有一个表的 IDENTITY_INSERT 属性可以设置为 ON。如果某个表已将此属性设置为 ON,并且为另一个表发出了 SET IDENTITY_INSERT ON 语句,则 Microsoft® SQL Server™ 返回一个错误信息,指出 SET IDENTITY_INSERT 已设置为 ON 并报告此属性已设置为 ON 的表。
如果插入值大于表的当前标识值,则 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' GO SELECT * FROM products GO -- 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 ON GO -- Attempt to insert an explicit ID value of 3 INSERT INTO products (id, product) VALUES(3, 'garden shovel'). GO SELECT * FROM products GO -- Drop products table. DROP TABLE products GO
分享到:
相关推荐
在数据库管理与开发过程中,`SET IDENTITY_INSERT` 是一个非常实用的功能,主要用于允许或禁止手动插入带有 `IDENTITY` 属性的字段值。这一特性对于需要进行数据迁移或者特殊场景下的数据操作非常重要。 #### 1. ...
在开启 `IDENTITY_INSERT` 之后,我们就可以在插入数据时为标识列指定值。关闭 `IDENTITY_INSERT` 则恢复到默认状态,即由数据库系统自动生成标识值。 下面是一个使用 `SET IDENTITY_INSERT` 的例子,假设我们要向...
错误提示"仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'*'中的标识列指定显式值"表明,系统不允许直接对具有自动增长属性的列插入显式值。这是SQL Server的一个安全机制,以防止意外覆盖自动增长序列。...
在SQL Server数据库管理系统中,自动增长(Identity)字段是一个非常重要的特性,主要用于为表中的记录生成唯一的标识符,通常作为主键使用。本教程将详细解释如何在SQL Server中设置和管理自动增长字段。 首先,...
在SQL Server数据库设计中,有时候我们需要创建一个列,它的值能自动递增,这通常用于主键字段,确保每一行数据都有唯一的标识。这个特性在SQL Server中被称为“标识列”(Identity Column)。下面我们将详细讲解...
`SET IDENTITY_INSERT` 是SQL Server提供的一种特殊语法,它允许用户在具有自增长属性的列中显式插入值。这个功能非常有用,特别是在数据迁移、备份恢复或导入数据时,我们需要保持原有的ID序列或者插入特定的ID值。...
在SQL Server 2012中,自增ID(Identity列)是数据库设计中的常见元素,用于自动为新插入的行生成唯一的标识符。然而,有时可能会遇到自增ID值跳过特定数值,例如从一个ID跳到1000或2000的情况。这种问题通常是由于...
比如我删除了 id=5 的数据,如果没有在 SET IDENTITY_INSERT TEST_SQL.DBO.STUDENT ON 及没有指定 id 这一列插入再次插入一条数据的时候,数据库是会自动标识 id=6 的。如果在这个时候需要强制 id 从 5 开始的话,...
在SQL Server数据库中,标识(IDENTITY)列是一种特殊类型的列,它自动为新插入的行生成唯一的整数值。这与Microsoft Access中的“自动编号”字段类似,它们都是设计用来在不需用户干预的情况下为记录分配唯一标识符...
然后我们通过`SET IDENTITY_INSERT ON`,成功插入了缺失的ID值,并在完成后关闭了该选项,以恢复自动增长功能。 通过理解并正确使用`SET IDENTITY_INSERT`,你可以更灵活地处理包含自动增长标识字段的数据导入,...
默认情况下,自动增长列不允许手动指定值,但可以通过设置`IDENTITY_INSERT`来允许这种操作。 **示例代码:** ```sql SET IDENTITY_INSERT tableName ON INSERT INTO tableName (id, column1, column2) VALUES (1,...
当 `ON` 时,可以为`identity`列指定值;当 `OFF` 时,恢复自动递增。 2. **实例演示**: ```sql create table student5( sid int primary key identity(20,5), sname nchar(8) not null, ssex nchar(1) ); ...
当设置为ON时,可以在INSERT操作时手工指定插入到标识列中的编号。操作完成后,必须将`IDENTITY_INSERT`还原成OFF,否则下次插入时必须手动指定编号。 - **示例二**:当表中的记录被全部删除后,如果标识列的值仍然...
可以通过设置`IDENTITY_INSERT`为`ON`来手动插入标识值,之后需将其设置回`OFF`。 - 当表中的所有行被删除后,标识列的值仍然持续增长。可以使用`DBCC CHECKIDENT`命令来重置标识列的种子值。 ```sql SET ...
Identity列是SQL Server中的一种自增长列,可以自动增长,但有时也会带来一些麻烦。例如,当表中删除了某些数据时,Identity列的编号就不再是一个连续的数列。这时可以使用SET IDENTITY_INSERT语句来解决。例如: ``...