我相信唯一能做到這一點的方法就是將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
爲什麼要這樣做? –
在重新啓動IDENTITY列的值之前,您是否刪除/截斷'Table1'? –
我需要這樣做,因爲我需要跟蹤傳入的作業,我們的作業管理系統分爲兩部分識別每個作業:1.四位MMYY(例如0714 = 2014年7月)和2. 5位數字00001( IDENTITY列)。 5位數字必須在每個月改變時重新開始計數。我不刪除或截斷任何列。 – user3694592