2014-01-15 63 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

相關問題