有没有办法保留或跳过或增加标识列的值?
我在一对一的关系中加入了两张桌子。第一个有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来做到这一点?
答案 0 :(得分:6)
这种情况会使您的整体数据结构难以理解。如果值之间没有关系,那么打破关系。
有很多方法可以解决这个问题,但是通常它是在分布式环境中,而不是因为看起来像是数据模型的变化。
答案 1 :(得分:4)
然后它不再是一对一的关系。
打破PK约束。
答案 2 :(得分:3)
使用DBCC CHECKIDENT
声明。
答案 3 :(得分:3)
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
它允许将显式值插入表的标识列。