`

sqlserver identity总结

 
阅读更多
想要将值插入到自动编号(或者说是标识列,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
分享到:
评论

相关推荐

    SQL SERVER 2000开发与管理应用实例

    本书不但融合了作者在使用SQL Server 2000过程中遇到的各种常见问题和应用案例,还总结了作者几年来在CSDN 社区SQL Server版所解决的大量问题,面向实际项目需求,涉及不同类型的应用,能够多角度地引导读者学习相关...

    identity用法总结

    identity用法总结,插入数据时,报544错误,在identity列删除数据再插入时,造成数据不连续性。简单介绍这几个问题的解决方法。

    Sqlserver2000经典脚本

    介绍就不多说了,下边是部分目录,觉得有用的话就顶一个 C:. │ sqlserver2000.txt │ ├─第01章 │ 1.9.1 设置内存选项.sql │ 1.9.2(2) 使用文件及文件组.sql │ 1.9.2(3) 调整...

    sqlserver2000基础(高手也有用)

    15.1.3 测试连接到SQL Server实例的方法总结 458 15.1.4 超时 459 15.1.5 单用户的问题 460 15.1.6 默认数据库问题 461 15.2 索引中的疑难解答 462 15.2.1 索引对查询条件的影响 462 15.2.2 索引对查询...

    数据库更新Sqlserver脚本总结

    表复制: 1. INSERT INTO SELECT语句 语句形式为:Insert ... 示例如下: 代码如下: –创建测试表 create TABLE Users1 ( UserID int identity (1,1) primary key not null, UserName varchar(10), UserAddress varch

    五种SQL Server分页存储过程的方法及性能比较

    本文我们总结了五种SQL Server分页存储过程的方法,并对其性能进行了比较,接下来就让我们来一起了解一下这一过程。 创建数据库data_Test : create database data_Test GO use data_Test GO create table tb_...

    通用数据库访问类sql server 版本常用方法封装

    /*============================================================================== ... * 学习和讨论有关asp.net mvc ,Ajax ,jquery ,,html/css,xml ,sqlserver ,wpf,IIS相关技术的交流和学习。

    经典SQL脚本大全

    │ sqlserver2000.txt │ ├─第01章 │ 1.9.1 设置内存选项.sql │ 1.9.2(2) 使用文件及文件组.sql │ 1.9.2(3) 调整tempdb数据库的文件属性.sql │ ├─第02章 │ │ 2.1 日期概念理解中的一些测试.sql │ │ ...

    【总结】数据库自增字段的 3 种实现方式

    SQL Server PostgreSQL SQLite 标识列(IDENTITY) — :check_mark: :check_mark: :check_mark: — 序列(SEQUENCE) — :check_mark: :check_mark: :check_mark: — AUTO_INCREMENT :check_mark: — — ...

    ASP.NET2.0高级编程(第4版)1/6

     20.3.3 对SQL Server的影响695  20.3.4 查看支持SQL  高速缓存禁用功能的表696  20.3.5 使表不支持  SQL Server高速  缓存禁用功能697  20.3.6 使数据库不支持  SQL Server高速  缓存禁用功能697  20.3....

    一个多层架构多种数据库结合NHibernate和Ext.Net实现用户增删除改查的小例子

    SqlServer建库脚本: CREATE TABLE [dbo].[QP_Users]( [QID] [int] IDENTITY(1,1) NOT NULL, [QName] [nchar](10) NULL, [QPass] [nchar](10) NULL, [QSex] [nchar](10) NULL, [QAccount] [nchar](50) NULL, ...

    一个多层架构多种数据库结合NHibernate和Ext.Net及Newtonsoft.Json实现用户增删除改查的小例子

    SqlServer建库脚本: CREATE TABLE [dbo].[QP_Users]( [QID] [int] IDENTITY(1,1) NOT NULL, [QName] [nchar](10) NULL, [QPass] [nchar](10) NULL, [QSex] [nchar](10) NULL, [QAccount] [nchar](50) NULL, ...

    2.ASP.NET.2.0.高级编程(第4版) [1/7]

    13.7.2 SQL Server Yukon 2005和XML数据类型 459 13.8 小结 459 第14章 站点导航 461 14.1 基于XML的站点地图 461 14.2 SiteMapPath 服务器控件 463 14.2.1 PathSeparator属性 465 14.2.2 PathDirection 属性 ...

    java 面试题 总结

    从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态。 9、...

Global site tag (gtag.js) - Google Analytics