代码改变世界

【转载】关于sqlserver自增长列的问题

2010-10-22 17:09  刺客之家  阅读(871)  评论(0编辑  收藏  举报

一、标识列的定义以及特性

SQL Server中的标识列又称标识符列,习气上又叫自增列。
该种列具有以下三种特性:

1、列的数据类型为不带小数的数值类型
2、在停止插入(Insert)操作时,该列的值是由系统按一定规律生成,不允许空值
3、列值不反复,具有标识表中每一行的作用,每个表只能有一个标识列。

由于以上特性,使得标识列在数据库的设计中得到普遍的运用。

二、标识列的组成
创立一个标识列,通常要指定三个内容:
1、类型(type)
在SQL Server 2000中,标识列类型必需是数值类型,如下:
decimal、int、numeric、smallint、bigint 、tinyint
其中要留意的是,中选择decimal和numeric时,小数位数必需为零
另外还要留意每种数据类型一切表示的数值范围

2、种子(seed)
是指派给表中第一行的值,默许为1

3、递增量(increment)
相邻两个标识值之间的增量,默许为1。

三、标识列的创立与修正
标识列的创立与修正,通常在企业管理器和用Transact-SQL语句都可完成,运用企业管理管理器比拟简单,请参考SQL Server的联机协助,这

里只讨论运用Transact-SQL的办法

1、创立表时指定标识列
标识列可用 IDENTITY 属性树立,因而在SQL Server中,又称标识列为具有IDENTITY属性的列或IDENTITY列。
下面的例子创立一个包含名为ID,类型为int,种子为1,递增量为1的标识列
CREATE TABLE T_test
(ID int IDENTITY(1,1),
Name varchar(50)
)

2、在现有表中添加标识列
下面的例子向表T_test中添加一个名为ID,类型为int,种子为1,递增量为1的标识列
--创立表
CREATE TABLE T_test
(Name varchar(50)
)

--插入数据
INSERT T_test(Name) VALUES('张三')

--增加标识列
ALTER TABLE T_test
ADD ID int IDENTITY(1,1)

3、判侗救嘶个表能否具有标识列

能够运用 OBJECTPROPERTY 函数肯定一个表能否具有 IDENTITY(标识)列,用法:
Select OBJECTPROPERTY(OBJECT_ID('表名'),'TableHasIdentity')
假如有,则返回1,否则返回0

4、判别某列能否是标识列

可运用 COLUMNPROPERTY 函数肯定 某列能否具有IDENTITY 属性,用法
SELECT COLUMNPROPERTY( OBJECT_ID('表名'),'列名','IsIdentity')
假如该列为标识列,则返回1,否则返回0

4、查询某表标识列的列名
SQL Server中没有现成的函数完成此功用,完成的SQL语句如下
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.columns
WHERE TABLE_NAME='表名' AND COLUMNPROPERTY(
OBJECT_ID('表名'),COLUMN_NAME,'IsIdentity')=1

5、标识列的援用

假如在SQL语句中援用标识列,可用关键字IDENTITYCOL替代
例如,若要查询上例中ID等于1的行,
以下两条查询语句是等价的
SELECT * FROM T_test WHERE IDENTITYCOL=1
SELECT * FROM T_test WHERE ID=1

6、获取标识列的种子值

可运用函数IDENT_SEED,用法:
SELECT IDENT_SEED ('表名')

7、获取标识列的递增量

可运用函数IDENT_INCR ,用法:
SELECT IDENT_INCR('表名')

8、获取指定表中最后生成的标识值

可运用函数IDENT_CURRENT,用法:
SELECT IDENT_CURRENT('表名')
留意事项:当包含标识列的表刚刚创立,为经过任何插入操作时,运用IDENT_CURRENT函数得到的值为标识列的种子值,这一点在开发数据库应用程序的时分特别应该留意。

9.[SQL Server]关于标识列从1开端计数的问题
在SQL Server中, 本人们有时需求在清空数据表之后,重新添加记载时,标识列重新从1开端计数。
本人们只需求在插入记载之前,执行下面的命令:
DBCC CHECKIDENT (表名, RESEED, 0)
执行 TRUNCATE TABLE 也能够做到,而且效率高由于:

用delete将会把每个操作记载到日志中,所以效率低 ,truncate table则一次过,效率快很多。
但是,Truncate Table有限制,比方说这个标识列是另外一个表的外键,而且标识列当前值为1,插入行从2开端,

而DBCC CHECKIDENT (表名, RESEED, 0)能够用于即便有外键的状况下。

本博客文章若非标记转载,均为原创,转载请注明出处~