我在错误记录后的自动增量列中出错

时间:2013-03-16 17:06:49

标签: sql sql-server-2008

在sql server 2008中

create table Person ( Person_ID bigint identity (1,1) not null Constraint PersonID_PK PRIMARY KEY (Person_ID) 

当记录正确时,它应该将id增加1个数字,如12345.在填写人员表上的其他列记录时会发生错误,但下次不应该增加1。接下来发生123错误id值为5,下一个错误id值为8,9,10,11两个错误下一个id值为13 plz告诉我解决方法如何自动递增在错误期间,它不应该错过价值。

2 个答案:

答案 0 :(得分:0)

在SQL Server中,如果表中有Identity列,并且在此表中插入记录时,如果插入失败,例如,由于检查约束,则idenitity仍将增加。

如果你想防止这种情况发生。您可以尝试创建“代替”触发器。例如:


CREATE TABLE TestTable 
(
 ID int IDENTITY (1, 1) NOT NULL,
  Name varchar(30) NOT NULL ,
) 
INSERT INTO TestTableVALUES ('Bob')
-- This will fail since NULL is not allowed
-- But id still +1
INSERT INTO TestTable VALUES (NULL)
INSERT INTO TestTable VALUES ('Mike')
-- Create INSTEAD OF trigger
CREATE TRIGGER TestTrigger
ON TestTable
INSTEAD OF INSERT
AS
-- Get the value(s) being inserted 
-- and repeat the insert
Declare @value varchar(100)
SET @value = (SELECT Name FROM Inserted)
-- If this statement fails, SQL won't increase the IDENTITY
INSERT INTO TestTable VALUES (@value)
-- Run the same INSERT again, when failed, ID will not increase
INSERT INTO TestTable VALUES('test1')
INSERT INTO TestTable VALUES(NULL)
INSERT INTO TestTable VALUES('test2')
SELECT * FROM TestTable 

答案 1 :(得分:0)

另一种替代方式,仅适用于您的第二个选择

每次插入失败后,您都可以重置种子


declare @maxid int
SELECT @maxid = MAX(id) FROM TestTable
DBCC CHECKIDENT('testtable',RESEED, @maxid ) WITH NO_INFOMSGS

用户下面的代码进行测试,它的工作原理。


INSERT INTO TestTable VALUES('test1')
INSERT INTO TestTable VALUES(NULL)
...reset seed
INSERT INTO TestTable VALUES('test2')
select * from TestTable