2012-06-29 6 views
0

테이블이 있다고 가정하면 첫 번째 열은 ID입니다. 나는 그 값이 하나의 automatelly에 의해 증가되었다고 생각했다. 내가ID 스크립트 삽입

1 
2 
3 
4 
... 
47 
48 
49 
50 

등이 열 내가 마지막 행 (ID = 50)을 삭제하고 새 행을 삽입, 왜 신원은 51이 아니라 50이 말?

감사합니다.

답변

1

행의 존재 여부에 따라 값이 사용됩니다. 삭제 외에도 삽입이 롤백 될 때 간격이 표시됩니다. 연속적인 정수의 연속열을 원한다면 신원은 답이 될 수 없습니다.

+0

IDENTITY_INSERT TABLE ON을 설정하여 갭을 적용 할 수 있습니까? –

+2

요점은 무엇입니까? 갭을 원하지 않는다면, 처음에는 신분을 사용하지 마십시오. 왜 틈새를 걱정하니? 이것들은 의미없는 대리 키입니다. 맞죠? 이유 *에 대한 간격에 대해 신경 쓰면 [이 답변] (http://stackoverflow.com/a/794628/61305)을 참조하십시오. –

+0

@Love 항상 실행되는 프로덕션 코드에서 SET IDENTITY_INSERT TABLE ON을 사용하지 마십시오. 다른 시스템에서 한 번만 삽입하면됩니다. dba만이 이것을 사용해야합니다. – HLGEM

0

ID 시드는 삭제의 영향을받지 않으므로 행이 삭제되지 않은 것처럼 다음 값이 계속 증가합니다.

또한 ID는 DBCC CHECKIDENT (http://msdn.microsoft.com/en-us/library/ms176057.aspx) 유틸리티를 사용하여 다시 시드 할 수 있습니다.

+0

값은 어디에 저장되어 있습니까? 시스템 테이블에? –

+0

@Love SQL Server는 기본적으로 메모리에서 실행 취소 할 값의 캐시를 보유합니다. 그것들을 다 써 버리면 더 많은 것을 얻습니다. IDENT_CURRENT()를 사용하여 테이블의 현재 값을 검색 할 수 있지만이 값을 사용하여 간격을 조정하지 마십시오. –

0

시드는 레코드와 별도로 추적됩니다. 레코드를 삭제하면 값이 계속 사용됩니다.

DBCC CHECKIDENT (YourTable, NORESEED) 

을 사용하면 다음 신원 값을 확인할 수 있습니다.

0

간격 조정을 시도하는 것은 매우 나쁜 생각입니다. 제대로하지 않으면 데이터 무결성 문제가 발생할 가능성이 큽니다. 거기에는 모든 응용 프로그램의 99.99 %에 간격이 생길 염려가 없습니다 (간격을 허용하지 않는 법적 요구 사항이있는 응용 프로그램이 몇 개 있습니다. 즉, ID를 사용하지 않는 응용 프로그램이 몇 개 있습니다).