6

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

我有两个表以一对一的关系连接。第一个有 IDENTITY PK 列,第二个是 int 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 来做到这一点?

4

7 回答 7

6

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

有一些方法可以解决这个问题来做你正在寻找的事情,但通常它是在分布式环境中,而不是因为似乎是数据模型更改而没有完成。

于 2009-01-26T16:16:25.080 回答
4

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

只需打破 PK 约束。

于 2009-01-26T16:14:44.880 回答
3

使用DBCC CHECKIDENT声明。

于 2009-01-26T16:14:08.330 回答
3

SQL Server 联机丛书中的这篇文章讨论了使用 DBCC CHECKIDENT 方法来更新表的标识种子。

从那篇文章:

此示例将作业表中的当前标识值强制为 30。

USE pubs
GO
DBCC CHECKIDENT (jobs, RESEED, 30)
GO
于 2009-01-26T16:24:38.277 回答
0

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

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

于 2009-01-26T17:41:17.700 回答
0

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

于 2009-01-26T18:14:44.483 回答
0

这可能会有所帮助

SET IDENTITY_INSERT [数据库名称。[模式名称]。] 表 { 上 | 离开 }

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

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

于 2009-01-26T18:58:15.190 回答