2014-01-15 86 views
-1

这不起作用:如何在SQL Server中将表重新设置为0?

DBCC CHECKIDENT('[DMS].[dbo].[ImportedFiles]', RESEED, 0) 

一旦下一条记录被插入,我要种子为0而不是1

我试过,但功能不喜欢它:

DBCC CHECKIDENT('[DMS].[dbo].[ImportedFiles]', RESEED, -1) 

DBCC CHECKIDENT('[DMS].[dbo].[ImportedFiles]', RESEED, '-1') 

如何重置表的种子,以便下一个记录进入ZERO? (0)?

+2

@ebyrob为什么要0无效?如果我从-10开始,如果SQL Server在到达时跳过0,该怎么办? –

+0

一般来说,第0条记录通常是一个特殊的记录,表示一个非值。在这种情况下,如果我想为此创建第0条记录,则可以通过启用标识插入手动插入,然后再次关闭它。 – David

+0

@ebyrob请在任何情况下为任何将0视为无效值的数据库找到我的文档,但不要介意只因为会跳过0的数据库。 –

回答

6

如果身份列定义为(0,1),并且该表是空的,而且不涉及外键,只需问题:

TRUNCATE TABLE dbo.ImportedFiles; 

如果表中有外键 - 或无论如何,对于这个问题 - 你可以重写值:

SET IDENTITY_INSERT dbo.ImportedFiles ON; 
INSERT dbo.ImportedFiles(col1, col2) SELECT 0, 'UNKNOWN'; 
SET IDENTITY_INSERT dbo.ImportedFiles OFF; 

我已经证实,@Avarkx's answer也适用 - 以-1补种应该产生一个0下一个插入所以我不知道你的版本'使用的地方这不起作用(我不知道如何解释“不喜欢它”) 。

5

我无法复制这...这是一个测试,工作,Sql Server 2012 R2。 2008 R2。

此外,@Anybody说0意味着什么,它确实没有。尽管将0值用作未知数等是相当常见的,但围绕IDENTITY列构建的业务逻辑是一种反模式,通常应该避免并且绝对不建议使用该模式。

CREATE TABLE dbo.Foo 
(
    Foo_PK  BIGINT IDENTITY(1, 1) NOT NULL, 
    Bar   BIT 
); 

INSERT INTO dbo.Foo (Bar) 
SELECT b.Bar 
FROM (  SELECT Bar = NULL 
UNION ALL SELECT Bar = 1 
UNION ALL SELECT Bar = 0) b; 

SELECT * 
FROM dbo.Foo; 

DBCC CHECKIDENT ('dbo.Foo', RESEED, -1); 

INSERT INTO dbo.Foo (Bar) 
SELECT b.Bar 
FROM (  SELECT Bar = NULL 
UNION ALL SELECT Bar = 1 
UNION ALL SELECT Bar = 0) b; 

SELECT * 
FROM dbo.Foo; 

GO 
DROP TABLE dbo.Foo; 
+0

“,而通常看到0个值被用作未知数等等,围绕IDENTITY列构建的业务逻辑是反模式。”这个。我试图打破这种习惯的大客户(软件和数据库人员习惯性假定ID为0是无效的,没有任何测试或分析)。当出现相关的错误时,这是​​非常困难和令人沮丧的,并且响应是“他们不应该使用0作为ID”。 –

+0

@ebyrob什么?我没有说任何一种方式,我所做的只是评论我如何发现Avarkx关于自动将零价值ID视为特殊情况的评论。在SQL Server/.Net世界中,这是一种令人讨厌而且不幸的事情(或者我只是需要更好的客户端?)反模式。 –

+0

@ebyrob我希望如果你依靠'WHERE a.FK = 1'而不是只做正确的连接和'WHERE a.Code ='UNKNOWN''等价物,那么这样的完全重建会更困难...... – Avarkx

相关问题