sql server中的自增问题

sql server 2005 如何设置int型数据自增,又如何插入一条记录?

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-BED592453CSQLEXPRESS,第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列

—————————————–华丽分割线————————————————————-

今天sql server的存储过程帮了我大忙啊,或许会因为今天让我慢慢喜欢上存储过程吧。

在使用数据库的时候,难免要在使用过程中进行删除的操作,如果是使用int类型的字段,令其自增长,这是个最简单的办法,但是后果会有些不是你想要的!看下这个Demo:
1.建立这样的简单的表Test.

2.设置字段id的自增.

3.表添加数据
insert into Test(name) values(‘TestName’)
insert into Test(name) values(‘TestName’)
insert into Test(name) values(‘TestName’)
4.你会看到

5.在这里我们删除id为2的行.就只剩下了id为1和id为3的两行数据了.(不上图了)
6.再添加一条数据.
insert into Test(name) values(‘TestName’)
我们会发现这或许不是我们想要的结果了

为什么没有id为2的呢?之后任你死命的加,也不会有id为2的数据行了!
这样的设计固然方便,但是魔鬼在于细节,这篇博客就是为了解决这个问题让我们重新见到id为2的数据行(这里顺便改进一下,让结果不只是显示id为2这样的int,假如有一天我们的各户要求我们他们要一个5位数的id号吗,从00000开始,OK,这没问题)
1.主角登场,存储过程终于派上了用场了

Create procedure [dbo].[insertName](@name nvarchar(50)) 
as
begin
     declare @i int
     set @i=1 
     while(@i<10000) 
     begin
       if exists(select convert(int,id) from numbertest where convert(int,id)=@i) 
       begin
       set @i=@i+1 
       continue
       end
       else
       begin
       insert numbertest values(right('0000'+convert(varchar(5),@i),5),@name)
       --这里的两个数字'5' 就是我们要设置的id长度
        break
     end
   end
end

2.用SQL 语句调用这个存储过程
execute insertName Test
你可以狂按几次,几十次,几百次,我们要的数据加进去了,

我们可以删除指定的id数据行,当我们再次进行添加的时候,之前被删掉的id行,将会被我们新添加的数据所覆盖,这样id就都可以连接起来了.
哦,对了,还没有说如何显示的是 ‘0’ 开头的呢?这个简单,将id的数据类型设置为nvarchar(5),就是这么简单!呵呵!
总结:
这里我们调用了存储过程,存储过程不宜多用,但是有的时候还真是用起来很方便,本文章对于刚刚工作的童鞋们应该还是有点帮助的吧,好好学习吧,生活很美好!
如释重负的感觉啊,终于搞定一个问题。
其实还有一个方法也可以解决:就是先将ID字段删除,再重新建一个。

虽然作者为我们解决了一个大麻烦,在此对作者表示感谢。
但是还是对作者有点看法:数据库是用来存储数据的地方,至于ID字段是否要按顺序的自动增量字段,没有人在乎这个,也没有人去看这个,只要前台能够完成想要的功能就行了,没有必要花这么多时间去解决这个方法,大家觉得有这个必要吗?

 

来源 aspbc.com

Leave a Reply

Your email address will not be published. Required fields are marked *