2014-06-23 26 views
0

是否有任何方法將標識列重新設置爲原始值?目前我有這個IDENTITY(1,1)作爲我的表格定義。我試着用這個方法補種它:將標識列重新設置爲原始值

DBCC CHECKIDENT (Table1, reseed, 1)

但是我注意到,這實際的SQL它補種當前種子+新的種子值,所以當我插入新行啓動自動增量次數在2而不是1.我也嘗試使新的種子值爲0,但後來插入的所有行最終爲1,並且列不再自動遞增。

順便說一句,如果它有幫助,我需要此列重新啓動其自動增加計數爲零,因爲我需要計數重新啓動每個月。插入後爲此設置了觸發器,但重新播種給我帶來一些麻煩。

+1

爲什麼要這樣做? –

+0

在重新啓動IDENTITY列的值之前,您是否刪除/截斷'Table1'? –

+0

我需要這樣做,因爲我需要跟蹤傳入的作業,我們的作業管理系統分爲兩部分識別每個作業:1.四位MMYY(例如0714 = 2014年7月)和2. 5位數字00001( IDENTITY列)。 5位數字必須在每個月改變時重新開始計數。我不刪除或截斷任何列。 – user3694592

回答

2

下面的語句:

DBCC CHECKIDENT('YourTableName', RESEED, 1); 

告訴數據庫一個類似於:

「嘿數據庫中YourTableName表中的最高標識值#1,所以下一個插入的記錄應該使用身份值#2「。

這就是爲什麼當您使用您的語句RESEED它時,表格以標識值2開始的原因。

更具體地說微軟的DBCC CHECKIDENT()幫助表示:

當前標識值設置爲new_reseed_value。如果自創建之後沒有行插入到表中,或者所有行都使用TRUNCATE TABLE語句刪除,則在運行DBCC CHECKIDENT後插入的第一行使用new_reseed_value作爲標識。否則,插入的下一行使用new_reseed_value +當前增量值。

如果表不是空的,同一性值設置爲一個小於標識列的最大值可導致下列條件之一:

  • 如果PRIMARY KEY或UNIQUE約束存在在標識列上,將在稍後向表中插入操作時生成錯誤消息2627,因爲生成的標識值將與現有值衝突。
  • 如果PRIMARY KEY或UNIQUE約束不存在,則後面的插入操作將導致重複的標識值。

這聽起來像你想你的表的初始啓動種子值改變從10。考慮到這一點,你需要修改表的定義使用:

IDENTITY(0,1); 

我希望這可以幫助。祝你好運。

0

不是一個真正的答案,但太長的評論,並涵蓋了這個問題。

我也嘗試使新種子值爲0,但後來插入的所有行最終爲1,並且列不再自動遞增。

我不能重現此問題:

IF OBJECT_ID(N'dbo.T', 'U') IS NOT NULL 
    DROP TABLE dbo.T; 

CREATE TABLE dbo.T(ID INT IDENTITY(1,1) NOT NULL); 
INSERT dbo.T OUTPUT inserted.* DEFAULT VALUES; 
-- OUTPUTS 1 

DELETE dbo.T; 
DBCC CHECKIDENT ('dbo.T', RESEED, 0); 
INSERT dbo.T OUTPUT inserted.* DEFAULT VALUES; 
-- OUTPUTS 1, I.E. RESEED TO 0 HAS WORKED FINE 

INSERT dbo.T OUTPUT inserted.* DEFAULT VALUES; 
-- OUTPUTS 2, SHOWS INCREMENT IS WORKING AS EXPECTED 

IF OBJECT_ID(N'dbo.T', 'U') IS NOT NULL 
    DROP TABLE dbo.T; 

值得注意的是,然而,對於一個空表中標識將在0開始,如果您使用0作爲RESEED值,即

TRUNCATE TABLE dbo.T; 
DBCC CHECKIDENT ('dbo.T', RESEED, 0); 
INSERT dbo.T OUTPUT inserted.* DEFAULT VALUES; 

將輸出0作爲插入的ID。

0

我相信唯一能做到這一點的方法就是將select所有的數據放到第二個表中。

然後你可以發出命令truncate table Table1

這將重置標識列。

然後,您將所有數據從臨時存儲重新插入主表(不插入舊標識)。

例...

注:上同時運行的每個代碼塊一個,沿途檢查次數,不跑了整個事情 - 我已經離開了「危險」的位註釋掉以防萬一

/** select all columns but NOT the id into a temp location (dont use a # table) **/ 
SELECT col1, col2, col3, col4, col5 
INTO tmpTable 
FROM Table1 

/** before truncation, double check counts in both match!! **/ 
-- SELECT COUNT(2) FROM tmpTable 
-- SELECT COUNT(2) from Table1 

-- TRUNCATE TABLE Table1 

INSERT INTO Table1 
SELECT col1, col2, col3, col4, col5 
FROM tmpTable 

/** before you drop temp table, make sure Table1 is ok! **/ 
-- SELECT COUNT(2) FROM tmpTable 
-- SELECT COUNT(2) from Table1 

-- DROP TABLE tmpTable 

這是一個快速測試來演示 - 我插入8行,刪除一個,然後重新插入。它們被正確地重新編號。

IF OBJECT_ID('DBO.TEST') IS NOT NULL DROP TABLE TEST 
IF OBJECT_ID('DBO.TMP') IS NOT NULL DROP TABLE TMP 

CREATE TABLE TEST ([ID] INT IDENTITY(1,1), [SOMESTRING] NVARCHAR(50)) 

INSERT INTO TEST([SOMESTRING]) 
SELECT 'HI' UNION 
SELECT 'THESE' UNION 
SELECT 'ARE' UNION 
SELECT 'SOME' UNION 
SELECT 'STRINGS' UNION 
SELECT 'JUST' UNION 
SELECT 'TO' UNION 
SELECT 'DEOMONSTRATE' 

SELECT * 
FROM TEST 

DELETE FROM TEST 
WHERE SOMESTRING='SOME' 

SELECT SOMESTRING 
INTO TMP 
FROM TEST 

TRUNCATE TABLE TEST 

INSERT INTO TEST 
SELECT SOMESTRING 
FROM TMP 

SELECT * FROM TEST