SQL Server自动增量

时间:2013-11-27 08:10:00

标签: sql sql-server-2008

我正在使用3-4个表并在所有这些表中使用自动增量。我希望所有的表都以1

开头

例如student表id从1开始,Registration表从1开始。

现在发生的事情是自动增量从学生表的最后一个id开始。例如,学生表中的LastRow ID为100,因此Registeration将从101开始。我希望它从1开始如何做。

4 个答案:

答案 0 :(得分:3)

如果您已经有一些值(表格不为空),那么这是不可能的。您可以清空所有表并运行DBCC CHECKIDENT command以重置自动增量主键的值,然后从1重新启动。

DBCC CHECKIDENT ("YourTableNameHere", RESEED, number);

如果number = 0,则在下一个插入中,自动增量字段将包含值1

如果number = 101,则在下一个插入中,自动增量字段将包含值102

但请注意,此命令只会重置标识列的值,不会检查冲突。我的意思是,如果值1已经存在,那么在尝试插入该表时会出现错误。

答案 1 :(得分:1)

我不认为在大多数RDBMS中这是可能的。 即使它是,我也不建议你这样做 - 如果表中已有行,你应该从MAX_ROWS + 1开始。

答案 2 :(得分:1)

从1次使用开始种子:

DBCC CHECKIDENT (students, RESEED, 0)

请注意: 如果你这样做,你必须确保表是空的

答案 3 :(得分:0)

正如Einav所说,这个问题应谨慎处理!

如果您的学生表是空的,并且您试图通过测试重置计数器,或者因为每年擦除数据库等,那么您可以使用DBCC CHECKIDENT命令(如果您使用的是MS) SQL Server)或者您可以对MySql http://dev.mysql.com/doc/refman/5.0/en/alter-table.html使用alter table(auto_increment)。

但要小心,因为任何外键依赖都必须重置 - 你可能遇到各种各样的麻烦。

以下是一个快速测试方案:

--Test variables & environment
DECLARE @TimeParam AS DATETIME
CREATE TABLE #Downtime (ID int identity, initial varchar(1))
INSERT INTO #Downtime VALUES('a')
INSERT INTO #Downtime VALUES('b')
INSERT INTO #Downtime VALUES('c')
INSERT INTO #Downtime VALUES('d')
INSERT INTO #Downtime VALUES('e')
INSERT INTO #Downtime VALUES('f')
INSERT INTO #Downtime VALUES('g')
INSERT INTO #Downtime VALUES('h')
INSERT INTO #Downtime VALUES('i')
INSERT INTO #Downtime VALUES('j')

--Queries
DBCC CHECKIDENT (#Downtime)
SELECT ID, initial FROM #Downtime
DELETE FROM #Downtime
DBCC CHECKIDENT (#Downtime, RESEED, 0)
INSERT INTO #Downtime VALUES('k')
SELECT ID, initial FROM #Downtime
DROP TABLE #Downtime

--results (first select)
ID  initial
1   a
2   b
3   c
4   d
5   e
6   f
7   g
8   h
9   i
10  j

--results (second select)
ID  initial
2   j

对于您的情况,您将使用:     DBCC CHECKIDENT('学生',RESEED,0);

请谨慎处理此命令,并在运行命令之前检查对此主键的所有引用。确保你也备份了数据库!