我相信唯一能做到这一点的方法就是将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