2014-02-19 67 views
-2

我用这个代码来创建这将由每个记录递增ID表:SQL服务器中删除,并增加

CREATE TABLE new_employees 
(
ID int IDENTITY(1,1), 
NAME varchar (20), 
BALANCE int 
) 

但是还有一个问题,比方说,我想删除ID 6和添加另一条记录后但新记录不采用该id 6,但它会转到下一个id(7)我怎么能这样做,如果我删除一个记录所有记录后,它在ID中减少?

+0

有什么好处?我认为从长远来看,这会让事情变得更加困难。 – Elias

+0

不要依赖身份来保持递增的值。通常情况下,即使没有删除的行,您也可以轻松地处理那些会出现垃圾的案例。你应该保持自己的价值。但是,我同意@Elias的好处是什么?你可以随时选择一个行号,如果你需要一个没有被持续的行号。 –

+5

你应该**不**尝试这样做! “回收”之前已经分配给一行的值是一个非常糟糕的主意! **不要这样做!** –

回答

1

这是不好的做法,但仍有可能。

你可以做这样的:

declare @max int; 
select @max = coalesce(max(key), 1) from table; 
dbcc checkident(table,reseed,@max) 

也看看这个线程: Reset AutoIncrement in SQL Server after Delete

+0

您可能应该使用类似'select @max = coalesce(max(key),1)from';以避免在最后一条记录被删除且表为空时出现问题。 – FrankPl

+0

@FrankPl很好,谢谢。 –

+0

@Fabian Bigler如果你的ID为1-10并且你删除了ID 8,那么该怎么办?所以,现在你有1-7和9-10。这会发生什么?我在想,MAX仍然是10,所以下一个ID仍然是11. –

0

你不能。这不是身份专栏的工作方式。事实上,即使没有删除,这些值也可能有差距。

相反,做计算,当你查询:

select row_number() over (partition by id) as seqnum 

能保持这样的列,如果你真的想使用上的更新触发器或类似的逻辑。身份不以这种方式工作,因为可能由于其他原因导致差距。

+0

事实上,他可以使用dbcc checkident重新设置id。 但这取决于你如何理解他的问题 –

+0

倒投了。这样做是一个可怕的想法,但可以重新调整。还截断表病重置身份 – jean

+0

@jean ..即使重新加入身份不能解决其他原因造成的空白问题。重新播种并不保证没有差距。而且,您仍然需要更新所有中间ID。是的,你可以用触发器做到这一点,但这不是真正的身份专栏。 –

0

不是做的最好的事情。如果你有一个标识字段,那就让它为你生成值。如果你想能够传递你的自我价值观,那么根本就不会让它成为一种身份价值。

但是,如果你想要做什么你正在尝试做的,那么你可以做这样的事情......

CREATE TABLE new_employees 
(
ID int IDENTITY(1,1), 
NAME varchar (20), 
BALANCE int 
) 
GO 
INSERT INTO new_employees (NAME, BALANCE) 
VALUES ('Name 1', 1),('Name 2', 2),('Name 3', 3), 
('Name 4', 4),('Name 5', 5) 
GO 

DELETE FROM new_employees 
WHERE ID > 3 

DBCC CHECKIDENT ('new_employees', RESEED,0) -<-- with seed value 0 

检查标识信息:当前标识值“5”,当前 列值'0'。
DBCC执行完成。如果DBCC打印错误 消息,请联系您的系统管理员。

DBCC CHECKIDENT ('new_employees', RESEED) --<-- WIth out any seed value 

这将补种值最高巢可能恒等式值。

检查身份信息:当前身份值'0',当前 列值'3'。
DBCC执行完成。如果DBCC打印错误 消息,请联系您的系统管理员。

INSERT INTO new_employees (NAME, BALANCE) 
VALUES ('Name 4', 4),('Name 5', 5),('Name 6', 6)