음 :
이 문제가되지 않습니다.
은 "문제는"디자인에 의해 아주, 아주 많이.
, 나는 반복하지 마십시오 IDENTITY 열이 빈틈이없는, 가치의 좋은, 연속 설정을 유지하기 위해 기대하지 않습니다. 틈이 있는지는 정말로 신경 쓰지 않아도되지만 모든 종류의 것들로 인해 발생할 수 있습니다. 삭제, 롤백, failovers and service restarts 등. 값에 대해 걱정하지 말고 갭을 방지하려고합니다. IDENTITY는 SQL Server가 갭을 방지하는 데 필요한 모든 추가 작업을 수행하지 않기 때문에 효율적으로 작동합니다. 그렇게하고 싶다면 직접 솔루션을 롤업해야합니다.
아, 다시 시드하는 것은 옵션이 아닙니다. 이유가 여기 있습니다. 첫째, (또는 적어도 기본 키가 IDENTITY 컬럼에없는)의 테이블은 기본 키가 없습니다 예를 보자 :
CREATE TABLE dbo.foo(id INT IDENTITY(1,1));
GO
INSERT dbo.foo DEFAULT VALUES;
GO 5
DBCC CHECKIDENT('dbo.foo', reseed, 0);
INSERT dbo.foo DEFAULT VALUES;
GO
SELECT id FROM dbo.foo ORDER BY id;
GO
DROP TABLE dbo.foo;
결과 :
id
----
1
1 <-- oops! Duplicate. We probably didn't want that, right?
2
3
4
5
이제 IDENTITY 열 경우
CREATE TABLE dbo.foo(id INT IDENTITY(1,1) PRIMARY KEY);
GO
INSERT dbo.foo DEFAULT VALUES;
GO 5
DBCC CHECKIDENT('dbo.foo', reseed, 0);
GO
INSERT dbo.foo DEFAULT VALUES;
GO
DROP TABLE dbo.foo;
아차 :
(꽤 공통) 기본 키도
메시지 수준 26, 수준 14, 상태 1, 줄 7
PRIMARY KEY 제약 조건 'PK_ foo _3213E83FE3F1E24C'위반. 'dbo.foo'개체에 중복 키를 삽입 할 수 없습니다. 중복 키 값은 (1)입니다.
명세서가 종료되었습니다.
그래서 당신이 할 제안합니까? 더 이상 예외가 없을 때까지 반복 하시겠습니까? 첫 번째 갭을 찾은 모든 종류의 복잡한 간격과 섬 코드를 작성한 다음 SET IDENTITY_INSERT ON;
을 수동으로 값을 삽입 하시겠습니까? 왜? 너는 무엇을 얻었 느냐? 행진을 20 억 회 돌격하고 오버플로합니까? 나는 IDENTITY 컬럼에 순차적 인 번호와 틈이없는 것에 대한 집착을 이해하지 못합니다. 그것은 대리모이며 의미없는 가치입니다. 나를 한 번 더 반복하자
간격은 문제가되지 않습니다.
문제는 기술이 아니다. 문제는 처음부터 틈새에 대해 걱정하고 있습니다. 격차에 신경 쓰면 IDENTITY를 사용하여이를 막는 방법을 찾는 것을 중단하십시오. IDENTITY, 마침표 사용을 중지하십시오. 또는 틈새를 걱정하지 마십시오.
나는 모든 다이어그램과 배경이 필요하다고 생각하지 않습니다. 이 질문은 "왜 내 신원 열에 틈이 있습니까?"라고 말할 수 있습니다. 그리고 거기에 가능성이 [거기에 문제가되지 않습니다 당신을 설득하는 정보와 함께 톤의 답변] (http://stackoverflow.com/search?q=gaps+identity+column) (또는, 만약 그렇다면, 어떻게 너 자신에 그것을 주변에 일하기 위하여). –
@AaronBertrand에게 감사의 말을 전합니다. –