SQL Server 自动递增列 IDENTITY


2011-02-14 17:09


 


注:可能出现的相关问题,仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表‘tablename‘中的标识列指定显示值……~)



SQL Server 通过IDENTITY 来设置

参数有2个,一个是“初始值”一个是“增量”。

 

1> CREATE TABLE test_create_tab2 (

2>   id   INT  IDENTITY(1, 1)  PRIMARY KEY,

3>   val  VARCHAR(10)

4> );

5> go

 

1> INSERT INTO test_create_tab2(val) VALUES ('NO id');

2> go


默认情况下INSERT语句中,不能对IDENTITY 的字段进行赋值。




1> INSERT INTO test_create_tab2(id, val) VALUES (6, 'id no use');

2> go

消息544,级别16,状态1,服务器HOME-BED592453C\SQLEXPRESS,第1行

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

 

 

1> INSERT INTO test_create_tab2(val) VALUES ('A');

2> INSERT INTO test_create_tab2(val) VALUES ('B');

3> INSERT INTO test_create_tab2(val) VALUES ('C');

4> INSERT INTO test_create_tab2(val) VALUES ('D');

5> go

 

1> SELECT * FROM test_create_tab2;

2> go

id          val

----------- ----------

          1 NO id

          2 A

          3 B

          4 C

          5 D

 

(5行受影响)

 

 

当IDENTITY列中间的数据被删除,造成数据不连续的时候。

可以通过SET IDENTITY_INSERT 表名ON/OFF语句来允许/禁止对IDENTITY列进行显式的插入动作。

 



--删除一个数据,造成数据不连续.

1> DELETE FROM test_create_tab2 WHERE id = 3;

2> go

 

(1行受影响)

 

--允许将显式值插入表的标识列中

1> SET IDENTITY_INSERT test_create_tab2 ON

2> go

1> INSERT INTO test_create_tab2(id, val) VALUES (3, 'id is use');

2> go

 

(1行受影响)

 

--不允许将显式值插入表的标识列中

1>  SET IDENTITY_INSERT test_create_tab2 OFF

2> go

1> SELECT * FROM test_create_tab2;

2> go

id          val

----------- ----------

          1 NO id

          2 A

          3 id is use

          4 C

          5 D

 

(5 行受影响)

 

 

IDENTITY的重置

方案一:通过truncate table 处理

[此命令将删除表中所有的数据,使用前你需要确认你是否要做这个操作. 如果不希望修改表数据的,请采用方案二]

1> truncate table  test_create_tab2;

2> go

1> INSERT INTO test_create_tab2(val) VALUES ('NO id');

2> go

 

(1行受影响)

1> select * from test_create_tab2;

2> go

id          val

----------- ----------

          1 NO id

 

(1行受影响)

 

方案二:使用DBCC

1> select * from test_create_tab2;

2> go

id          val

----------- ----------

          2 NO id

 

(1行受影响)

1> delete from test_create_tab2;

2> go

 

(1行受影响)

 

查看当前ID。

1> DBCC CHECKIDENT('test_create_tab2', NORESEED)

2> go

检查标识信息:当前标识值'2',当前列值'2'。

DBCC执行完毕。如果DBCC输出了错误信息,请与系统管理员联系。

 

重置ID

1> DBCC CHECKIDENT('test_create_tab2', RESEED, 100)

2> go

检查标识信息:当前标识值'2',当前列值'100'。

DBCC执行完毕。如果DBCC输出了错误信息,请与系统管理员联系。

1> INSERT INTO test_create_tab2(val) VALUES ('NO id');

2> go

 

(1行受影响)

1> select * from test_create_tab2;

2> go

id          val

----------- ----------

        101 NO id

 

(1行受影响)

 

 

 

 

IDENTITY只能在如下情况下建立:

在创建表时创建新的IDENTITY列

在现有表中创建新的IDENTITY列

不能 把已经存在的列,修改为IDENTITY列