IDENTITY(属性)
在表中创建一个标识列。该属性与 CREATE TABLE 及 ALTER TABLE Transact-SQL 语句一起使用。 //注意红字部分
![](https://www.cnblogs.com/zshsuming/admin/mk:@MSITStore:C:/Program%20Files/Microsoft%20SQL%20Server/80/Tools/Books/tsqlref.chm::/Basics/note.gif)
说明 IDENTITY 属性与 SQL-DMO Identity 属性不同,后者表现列的行标识属性。
语法
IDENTITY [ ( seed , increment ) ]
参数
seed
装载到表中的第一个行所使用的值。
increment
增量值,该值被添加到前一个已装载的行的标识值上。
必须同时指定种子和增量,或者二者都不指定。如果二者都未指定,则取默认值 (1,1)。
以上是SQL2000帮助中得到的信息
IDENTITY(1,1) 经常让数据库管理员用来设置自动增量的标识列
CREATE TABLE XY(A INT NOT NULL IDENTITY(1,1),B VARCHAR)
一个有标识列的表就建立好了,在我们插入数据时不需要关心A列,SQL2000会自动为它插入数据。
下面我们来说下这篇文章的重点,就是大数据量数据转换,首先让我们关注一下,帮助信息里面红字部分。
帮助中提到IDENTITY可以和ALTER TABLE 一起使用。那么我们来测试一下,首先,我们建立一张没有标识列的表
CREATE TABLE XY(A INT NOT NULL,B VARCHAR)
然后我们打开ISQLW.EXE
执行下面的语句
ALTER TABLE XT ALTER COLUMN A INT NOT NULL IDENTITY(1,1)
我们会发现报出一个错误。如下图
单从语法规则上看,这个语句是没有错误的,但是SQL2000,是不允许我们通过ALTER TABLE来修改表的IDENTITY属性的。(个人认为这是帮助上的一个错误,如果小弟说错了,请大家指正)
为什么这么说呢?让我们来看看SQL2000企业管理器是如何修改IDENTITY属性的吧,打开企业管理器和查询分析器,观察一下企业管理器是如何修改的
选中行的全部代码,如下图
大家一看就明白了,首先创建一张Tmp_XY的临时表,设置和XY相同的列名,并且设置IDENTITY列,然后将数据全部插入到临时表(这里是重点,等下会说到),之后再修改临时表的名称
为原始表的名称
好了,让我们说下重点,大家都知道,默认情况下,标识列是不能直接插入数据的,为什么这里可以呢?让我们来看看SET IDENTITY_INSERT [ON | OFF] 这个系统开关
以下是SQL2000帮助得到的信息
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
这回大家就明白了,SQL2000开发人员早就为我们准备好了这样的一个系统开关,用来对有IDENTITY列的表进行大数据量的插入操作,来达到复制数据到有IDENTITY列属性的表的目的
补充一下,说到IDENTITY属性,我们还应该提到一个常用的全局变量 @@Identity。那么请和我一样的初学者自己查看帮助了,因为我没有养成看帮助的习惯,所以希望初学者都能养
成看帮助的良好习惯
我想看到这里,你已经对具有IDENTITY标识列的表插入数据有了解决方案,我这里就不废话了。
最后,小弟写的可能不是很好,还请各位大牛多多指教