如何在不插入表的情况下增加(或保留)SQL Server中的IDENTITY值

时间:2009-01-26 16:08:01

标签: sql-server foreign-keys identity

有没有办法保留或跳过或增加标识列的值?

我在一对一的关系中加入了两张桌子。第一个有IDENTITY PK列,第二个有PK(不是IDENTITY)。我以前插入,获取ID并插入第二个。它运作正常。

现在我需要在第二个表中插入值而不插入第一个。

现在,如何增加IDENTITY种子,所以我可以将它插入到第二个表中,但在第一个表的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来做到这一点?

7 个答案:

答案 0 :(得分:6)

这种情况会使您的整体数据结构难以理解。如果值之间没有关系,那么打破关系。

有很多方法可以解决这个问题,但是通常它是在分布式环境中,而不是因为看起来像是数据模型的变化。

答案 1 :(得分:4)

然后它不再是一对一的关系。

打破PK约束。

答案 2 :(得分:3)

使用DBCC CHECKIDENT声明。

答案 3 :(得分:3)

SQL Server联机丛书中的

This article讨论了使用DBCC CHECKIDENT方法更新表的标识种子。

从那篇文章:

此示例强制将jobs表中的当前标识值设置为值30。

USE pubs
GO
DBCC CHECKIDENT (jobs, RESEED, 30)
GO

答案 4 :(得分:0)

如果您使用的是SQL Server 2005或更高版本,我会查看OUTPUT INTO功能。这将允许您插入主表,并获取当时分配的ID以在辅助表中创建行。

我假设存在强制执行的外键约束 - 因为这是您首先需要执行此操作的唯一原因。

答案 5 :(得分:0)

您打算如何在以后进行匹配?我不会在第一个表中没有记录的情况下将记录放入第二个表中,这就是为什么它是在外键关系中设置的 - 以此来表示这种行为。为什么你不想将记录插入到第一个表中呢?如果我们更了解应用程序的类型以及为什么需要这样做,我们可能会引导您找到解决方案。

答案 6 :(得分:0)

这可能会有所帮助

SET IDENTITY_INSERT [database_name。 [schema_name]。 ]表{ON |关闭}

http://msdn.microsoft.com/en-us/library/aa259221(SQL.80).aspx

它允许将显式值插入表的标识列。

相关问题