在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告诉我解决方法如何自动递增在错误期间,它不应该错过价值。
答案 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