2

在 sql server 2008 中

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

当记录正确时,它应该增加id1 个数字,如 12345。在填充人员表上的另一列记录期间发生错误,但下次它不应该增加 1,它会丢失。123 错误发生下一个id值是 5,两个错误下一个id值是 8、9、10、11 两个错误下一个id值是 13 请告诉我解决方案我如何在错误期间自动增加它不应该错过该值。

4

2 回答 2

0

在SQL Server中,当表中有一个Identity列,当你在这个表中插入一条记录时,如果插入失败,例如由于检查约束,identity仍然会增加。

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


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 

于 2013-03-16T17:26:08.757 回答
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

于 2013-03-16T17:38:53.377 回答