我设置了ID identity(1,1) 我加了10个数据,然后删除了第5行的,然后再加入一条新的数据,但ID就变成了11,怎样将新增数据的ID自动填充最大ID之前空的ID.即是新增的数据ID不是变成11,而是5,然后再增加一条才是11.我用的是SQL Server2008
做不到,除非不用自增,每次开事务去寻找空值来填写
看看这个,就知道了
-- 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
SQL Server 2008 不会自动所想的那样处理。原因如下:
每行有个索引,如果如你所想,先插入5,那么会引起索引重排,也就是索引的物理移动。而如果是11,则在索引后直接添加。
更多索引相关,请看:SQL Server 索引内幕:
http://www.cnblogs.com/downmoon/archive/2010/02/04/1663956.html
如果一定需要处理,可以新增一个列,让其自增长,且不用于复制。每次U/I/D时处理这个列。
自己另增加一个排序字段,上一条记录的自增+1。
truncate table 表名 //这个命令可以清楚自增字段值。
你删的还只是最大的几条记录,那要是删的中间的记录呢,你怎么处理呀? 就是一个自增的序列,唯一标记一行数据,我们也只用这一唯一标记这一点,业务上根本用不着或者说不应该用来做别的
那你用自增长就没意义了
其实表里面的是不连续, 你查询时可以用row_number() over(order by id) as NumID, ID
你需要通过ID绑定的时候用ID, 你需要显示为顺序的用NumID
不需要数据库里面是连续的, 就算上面的办法能做好, 那个效率也是好差的.
一个系统, 添加数据时, 需要扫描整表, 看看那些ID不存在, 先插进去, 这样你你插1万条数据试一下, 一定会比平时正常的插多多10倍以上的时间