好的,我在数据库主题方面缺乏经验,但考虑到你的表中有一个名为id
的字段的情况,它是Indexable / Increment-seeding。
所以也许你有1-60行,所以id在1-60之间,增量为“61”。
如果删除30-50行,那么增量是否应该回到“31”?填写那些30-50个ID,然后再回到61?
我的问题:::为什么不用MSSQL / SQL Server,这样做? 30-50之间丢失的未使用的ID永远不会再次使用。
此外,如果你在id 500-600之间手动插入一些行怎么办?当增量变为“500”时,是否会出现“重复键”错误? ???
因此,如果您的某些表格经常被每个用户更改 - 删除,插入,删除,插入,您最好希望id
是bigint,因为它会很快进入1,000,000+区域,如果你有足够的用户。
答案 0 :(得分:4)
如果该字段用作唯一ID,则不应让它重用值。删除后,不应重复使用值。
如果字段是自动生成的,则不应手动设置其中的值,特殊情况除外(如复制)。
是的;您需要确保选择足够大的数据类型。不要拉扯类似Y2K的特技并不必要地限制你的应用程序。
答案 1 :(得分:1)
如果您使用自动增量字段,强烈建议让SQL Server为您处理值。它以最小化完整性冲突的方式这样做。
也就是说,如果您真的想在大量删除后重置id值,请考虑使用TRUNCATE TABLE
(如果要清除整个表,则会自动重置自动增量值),或DBCC CHECKIDENT
如果你需要更好地控制它是如何工作的。
编辑:
这是为了演示当自动增量ID值中存在手动执行的间隙时SQL Server的行为:
BEGIN TRAN
create table #t1 (id int identity, data int)
insert into #t1 (data) values (1)
insert into #t1 (data) values (2)
insert into #t1 (data) values (3)
insert into #t1 (data) values (4)
select * from #t1
dbcc checkident(#t1, reseed, 10)
insert into #t1 (data) values (5)
insert into #t1 (data) values (6)
insert into #t1 (data) values (7)
insert into #t1 (data) values (8)
select * from #t1
dbcc checkident(#t1, reseed, 5)
insert into #t1 (data) values (9)
insert into #t1 (data) values (10)
insert into #t1 (data) values (11)
insert into #t1 (data) values (12)
insert into #t1 (data) values (13)
insert into #t1 (data) values (14)
insert into #t1 (data) values (15)
insert into #t1 (data) values (16)
select * from #t1 -- this will demonstrate that SQL Server is quite happy to duplicate IDs if you have manually introduced a gap and then reset the ID to a lower value...
truncate table #t1
insert into #t1 (data) values (1)
insert into #t1 (data) values (2)
insert into #t1 (data) values (3)
insert into #t1 (data) values (4)
select * from #t1 -- this will show that TRUNCATE TABLE does (yes, really!) reset the autoincrement id value.
create table #t2 (id int identity primary key, data int)
insert into #t2 (data) values (1)
insert into #t2 (data) values (2)
insert into #t2 (data) values (3)
insert into #t2 (data) values (4)
select * from #t2
dbcc checkident(#t2, reseed, 10)
insert into #t2 (data) values (5)
insert into #t2 (data) values (6)
insert into #t2 (data) values (7)
insert into #t2 (data) values (8)
select * from #t2
dbcc checkident(#t2, reseed, 5)
-- the errors you are about to get should demonstrate that if there is an integrity constraint (in this case, the ever-popular PRIMARY KEY constraint) you will get errors when attempting to insert duplicates.
insert into #t2 (data) values (9)
insert into #t2 (data) values (10)
insert into #t2 (data) values (11)
insert into #t2 (data) values (12)
insert into #t2 (data) values (13)
insert into #t2 (data) values (14)
insert into #t2 (data) values (15)
insert into #t2 (data) values (16)
select * from #t2
ROLLBACK