2

SQLServer2008で

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

レコードが12345のように正しい場合は、1ずつインクリメントidする必要があります。personテーブルの他の列レコードの入力中にエラーが発生しますが、次回は1ずつインクリメントしないでください。123エラーが発生する次idの値は5、2つのエラーの次のid値は8、9、10、112つのエラーの次の値は13plzはid、エラー中に値を見逃してはならないことを自動インクリメントする方法を教えてください。

4

2 に答える 2

0

SQL Server では、テーブルに ID 列があり、このテーブルにレコードを挿入するときに、たとえばチェック制約のために挿入が失敗した場合でも、ID は増加します。

それを防ぎたいなら。「代わりに」トリガーを作成してみることができます。例えば:


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 に答える