首页 新闻 搜索 专区 学院

SQL自动增长问题

0
悬赏园豆:20 [已关闭问题]

我设置了ID identity(1,1) 我加了10个数据,然后删除了第5行的,然后再加入一条新的数据,但ID就变成了11,怎样将新增数据的ID自动填充最大ID之前空的ID.即是新增的数据ID不是变成11,而是5,然后再增加一条才是11.我用的是SQL Server2008

NCCC的主页 NCCC | 初学一级 | 园豆:22
提问于:2010-05-27 22:29
< >
分享
其他回答(6)
0

做不到,除非不用自增,每次开事务去寻找空值来填写

Gray Zhang | 园豆:17610 (专家六级) | 2010-05-27 23:31
0
看看这个,就知道了

-- Create tool table.
CREATE TABLE dbo.Tool(
   ID INT IDENTITY NOT NULL PRIMARY KEY, 
   Name VARCHAR(40) NOT NULL
)
GO
-- Inserting values into products table.
INSERT INTO dbo.Tool(Name) VALUES ('Screwdriver')
INSERT INTO dbo.Tool(Name) VALUES ('Hammer')
INSERT INTO dbo.Tool(Name) VALUES ('Saw')
INSERT INTO dbo.Tool(Name) VALUES ('Shovel')
GO

-- Create a gap in the identity values.
DELETE dbo.Tool 
WHERE Name = 'Saw'
GO

SELECT * 
FROM dbo.Tool
GO

-- Try to insert an explicit ID value of 3;
-- should return a warning.
INSERT INTO dbo.Tool (ID, Name) VALUES (3, 'Garden shovel')
GO
-- SET IDENTITY_INSERT to ON.
SET IDENTITY_INSERT dbo.Tool ON
GO

-- Try to insert an explicit ID value of 3.
INSERT INTO dbo.Tool (ID, Name) VALUES (3, 'Garden shovel')
GO

SELECT * 
FROM dbo.Tool
GO
-- Drop products table.
DROP TABLE dbo.Tool
GO
SingleYW | 园豆:215 (菜鸟二级) | 2010-05-28 02:15
这个方法可以实现,但是问题就是在插入数据之前,你需要知道中间有哪些ID对应的没有记录
支持(0) 反对(0) 上不了岸的鱼 | 园豆:4613 (老鸟四级) | 2010-05-28 09:53
在不知道哪个ID删除了的情况下,你这方法是行不通
支持(0) 反对(0) NCCC | 园豆:22 (初学一级) | 2010-05-28 10:55
既然可以插入标识值了,剩下的就只是算法问题了
支持(0) 反对(0) SingleYW | 园豆:215 (菜鸟二级) | 2010-05-29 00:10
0

SQL Server 2008 不会自动所想的那样处理。原因如下:

每行有个索引,如果如你所想,先插入5,那么会引起索引重排,也就是索引的物理移动。而如果是11,则在索引后直接添加。

更多索引相关,请看:SQL Server 索引内幕:
http://www.cnblogs.com/downmoon/archive/2010/02/04/1663956.html

如果一定需要处理,可以新增一个列,让其自增长,且不用于复制。每次U/I/D时处理这个列。

邀月 | 园豆:25375 (高人七级) | 2010-05-28 08:02
0

自己另增加一个排序字段,上一条记录的自增+1。

truncate table 表名  //这个命令可以清楚自增字段值。

Astar | 园豆:40805 (高人七级) | 2010-05-28 08:55
这个会清空表中的全部数据和日志
支持(0) 反对(0) 上不了岸的鱼 | 园豆:4613 (老鸟四级) | 2010-05-28 09:52
0

你删的还只是最大的几条记录,那要是删的中间的记录呢,你怎么处理呀? 就是一个自增的序列,唯一标记一行数据,我们也只用这一唯一标记这一点,业务上根本用不着或者说不应该用来做别的

千羽 | 园豆:666 (小虾三级) | 2010-05-28 09:42
0

那你用自增长就没意义了

builderman | 园豆:256 (菜鸟二级) | 2010-05-28 10:58
0

其实表里面的是不连续, 你查询时可以用row_number() over(order by id) as NumID, ID

你需要通过ID绑定的时候用ID, 你需要显示为顺序的用NumID

不需要数据库里面是连续的,  就算上面的办法能做好,  那个效率也是好差的.

一个系统, 添加数据时, 需要扫描整表, 看看那些ID不存在, 先插进去, 这样你你插1万条数据试一下, 一定会比平时正常的插多多10倍以上的时间

风浪 | 园豆:2980 (老鸟四级) | 2010-05-28 12:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册