2013-10-25 2 views
1

데이터를 올바르게 입력하면 테이블이 정상적으로 작동합니다. 데이터를 삽입 할 수 있고 IDENTITY 값은 1, 2, 3, 4입니다. 그러나 실수로 오류 메시지가 표시되는 경우IDENTITY 열에 왜 간격이 있습니까?

'x'열, 'table'테이블에 NULL 값을 삽입 할 수 없습니다. 열이 널을 허용하지 않습니다. INSERT가 실패합니다.
명세서가 종료되었습니다. 나는 성공적으로 다른 행을 삽입 할 경우

그런 다음 IDENTITY 값은 내가이 문제를 해결할 수있는 방법 5.

6 아닌가요? 첫째

+0

나는 모든 다이어그램과 배경이 필요하다고 생각하지 않습니다. 이 질문은 "왜 내 신원 열에 틈이 있습니까?"라고 말할 수 있습니다. 그리고 거기에 가능성이 [거기에 문제가되지 않습니다 당신을 설득하는 정보와 함께 톤의 답변] (http://stackoverflow.com/search?q=gaps+identity+column) (또는, 만약 그렇다면, 어떻게 너 자신에 그것을 주변에 일하기 위하여). –

+0

@AaronBertrand에게 감사의 말을 전합니다. –

답변

10

음 :

이 문제가되지 않습니다.

은 "문제는"디자인에 의해 아주, 아주 많이.

, 나는 반복하지 마십시오 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, 마침표 사용을 중지하십시오. 또는 틈새를 걱정하지 마십시오.

+0

신분 확인 열을 다시 시드하는 것에 동의하지 않을 경우 문제가 발생합니다. 대부분의 경우 PK-IDENTITY 열과 관련된 불필요한 간격이 있으며 때로는 받아 들일 수없는 경우가 있습니다. Reseed 기반 솔루션은 결국 제대로 된 생각이 들게됩니다. – OzrenTkalcecKrznaric

+5

@Orzen 110 %는 의견이 맞지 않습니다. - "바로이"할 방법이 없습니다. 내 편집을 참조하십시오. –

+3

** 간격은 문제가 아닙니다. ** - 눈을 즉시 잡으려면 굵은 글씨로 표시해야합니다. 그러면 사람들은 사실을 더 빨리 더 빨리 배우게됩니다. –

관련 문제