如何在SQL Server中递增(或保留)IDENTITY值而不插入表格?

7
有没有一种方法可以保留、跳过或增加标识列的值?
我有两个表,它们之间具有一对一的关系。第一个表具有IDENTITY PK列,第二个表具有int PK(不是IDENTITY)。我通常在第一个表中插入数据并获取ID,然后再插入第二个表。这样做可以正常工作。
现在我需要向第二个表中插入数据,而不是先插入第一个表。那么如何增加IDENTITY seed的值,以便我可以将其插入到第二个表中,但在第一个表的ID处“留下空隙”?
编辑:更多信息
-- I need new seed number, but not table row 
-- so i will insert foo row, get id, and delete it
INSERT INTO TABLE1 (SomeRequiredField) VALUES ('foo'); 
SET @NewID = SCOPE_IDENTITY(); 
DELETE FROM TABLE1 WHERE ID=@NewID;

-- Then I can insert in TABLE2  
INSERT INTO (ID, Field, Field) VALUES (@NewID, 'Value', 'Value'); 

再次确认 - 这确实可行。

问题是我能否在不插入表中的情况下获得ID?

DBCC需要所有者权限;是否有一个干净的用户可调用的SQL来完成这个操作?


你能提供一个例子或样本数据来更好地解释你的问题吗?我不确定我理解你想要实现什么。 - Eppz
1
在设置主键之前无法创建外键约束。要实现您的目标,您需要删除外键约束并更改主键,使其不再是标识列。您可能需要提供更多信息;可能有更好的方法来实现您的最终目标。 - BankZ
7个回答

6

这种情况会使你的整体数据结构变得非常难以理解。如果值之间没有关系,则断开它们之间的关系。

虽然有办法绕过这个问题来实现你想要的功能,但通常只在分布式环境下才使用,因为这似乎需要更改数据模型。


4

那么它就不再是一对一的关系了。

只需打破主键约束即可。


3

3
这篇来自SQL Server Books Online的文章讨论了使用DBCC CHECKIDENT方法更新表的标识种子。从那篇文章中得知:此示例将作业表中当前的标识值强制更改为30。
USE pubs
GO
DBCC CHECKIDENT (jobs, RESEED, 30)
GO

0

如果你正在使用 SQL Server 2005 或更高版本,我建议你研究一下 OUTPUT INTO 功能。这将允许你插入到主表中,并在那时获取分配的ID来创建辅助表中的行。

我假设已经强制执行了外键约束 - 因为这是你需要首先考虑的唯一原因。


0
你打算以后如何匹配它们?我不会在第二个表中插入记录,而没有第一个表中的记录,这就是为什么它设置了外键关系-防止这种操作的原因。那么你为什么不想向第一个表中插入记录呢?如果我们更了解应用程序的类型和为什么需要这样做,我们可能能够指导您找到解决方案。

第一个表是文档,其他表是由与文档相同ID匹配的特定表(例如发票)。现在我收到了将POS收费类型的文档添加到应用程序的请求。由于POSDocs的数量可能很大,我不想将它们放在Docs中。我只想保留ID以存储在POSDocs中。 - dmajkic

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接