2013-11-27 102 views
0

我正在使用3-4个表格,并在所有这些表格上使用自动增量。我想所有的表开始与1SQL Server自动增量

例如student表ID开始从1,和Registration表从1

眼下发生的事情自动增量开始与学生表的最后一个ID开始。例如,学生表中的LastRow ID为100,所以Registeration将从101开始。我希望它从1开始如何做到这一点。

+0

你尝试过什么吗?你为什么要这样做?我想所有的表都是空的,因为如果已经有一些值,首先插入的主键已经有值1,所以你不能重复这个值。 – Yaroslav

+0

是学生表空吗? – sumit

回答

0

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

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

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

这里是一个快速测试场景:

--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);

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

+1

Reseeding为1,第一次插入将添加标识值2,而不是1。 – Yaroslav

+0

谢谢@Yaroslav,我一定是在自动驾驶仪上工作......复制并粘贴错误 - 回答改变了。 – Mack

1

我不认为这在大多数RDBMS中是可行的。 就算是,我不会建议你这样做 - 如果已经有表中的行,你应该用MAX_ROWS启动+ 1

1

开始用1种:

DBCC CHECKIDENT (students, RESEED, 0) 

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

3

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

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

如果number = 0,那么在接下来的插入自动递增字段将包含值1

重启

如果number = 101,然后在接下来的插入自动递增字段将包含价值102

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